2014-02-06 75 views
6

我正在閱讀MongoDB數據庫參考文檔中的manual references部分,但我並不真正瞭解「解析引用字段的第二個查詢」部分。你能給我一個這個查詢的例子,所以我可以更好地瞭解他們在談論什麼。MongoDB - 手冊參考示例

「手動引用是指將一個文檔的_id字段包含在另一個文檔中的做法,然後應用程序可以根據需要發出第二個查詢來解析引用的字段。

回答

7

該文檔在您所指的手冊部分非常明確,其中有關於Database References的部分。在理解這個最重要的部分被包含在頁面上的開幕詞:

「的MongoDB不支持聯接在MongoDB中一些數據規格化或存儲有相關數據的文件刪除,需要加入。但是,在某些情況下,將相關信息存儲在單獨的文檔中通常在不同的集合或數據庫中是有意義的。「

的更多信息,包括你可能選擇如何處理與訪問您在另一個集合存儲數據的話題。

還有就是DBRef規範其沒有考慮太多更詳細,可以被某些驅動程序中的一種方式,當這些在你的文件被發現,他們將自動檢索(擴大)引用文檔到當前實現文件。這將通過針對該_id文檔的另一個查詢來實現「幕後」。

Manual References的情況下,這基本上是說您的文檔中只有一個字段具有來自另一個文檔的ObjectId。這隻與DBRef有所不同,因爲永遠不會由基本驅動程序實現處理是離開你如何處理任何其他文檔的進一步檢索讓你自己。

在的情況下:

> db.collection.findOne() 

{ 
    _id: <ObjectId>, 
    name: "This", 
    something: "Else", 
    ref: <AnotherObjectId> 
} 

文檔中的ref場只不過是一個普通的ObjectId越來越沒有什麼特別之處。這是什麼讓你做的是提交自己的查詢來獲取對象的細節這是指:

> db.othercollection.findOne({ _id: <AnotherObjectId > }) 
{ 
    _id: <ObjectId> 
    name: "That" 
    something: "I am a sub-document to This!" 
} 

記住,所有這一切都在處理通過驅動程序API客戶端保留。任何情況下,都不會在服務器上獲取其他文檔。