2011-03-05 99 views
4

我有這樣的MongoDB的文件:在pymongo中嵌入文檔的最佳方式是什麼?

{ 
"user": ObjectID("4d71076b26ab7b032800009f") 
"pages" : [ 
    { 
     "name" : "Main", 
     "content" : [ 
      { 
       "id" : ObjectId("4d71076b26ab7b052800009f") 
      }, 
      { 
       "id" : ObjectId("4d61269b1deb5a3fce000004"), 
       "link" : "http://example.com" 
      } 
     ] 
    } 
]} 

你可以看到,關鍵的「頁」是與其他文檔的數組。現在我可以用一個頁面的名稱查詢這個文檔,並且我將獲得包含所有頁面和其他信息的完整文檔。我直接在python中使用python來查詢文檔,但現在我不知道從數組頁面獲取頁面的最佳方式。我認爲是這樣的:

def getPage(pageNameWhoINeed): 
    for page in pages: 
     if page['name'] == pageNameWhoINeed: 
      return page 

但是,這是獲得單一頁面或一般嵌入式文檔的最佳方式?所有tipps或代碼片段都歡迎。

謝謝! Jarus

回答

2

是的你是對的。在mongodb中,您無法加載沒有父級的嵌入式文檔。您可以通過子文檔的某些屬性加載父文檔。

pages.find({"pages.name", "Main"}); //should load all document that contains pages collection and at least one item in embedded collection with name 'Main'. 

比你需要遍歷所有嵌入式文檔找到你需要的頁面。

如果你經常需要加載嵌入式文檔,你需要重新設計你的數據庫(將頁面移動到根集合,但在我看來,你的模式都可以)。

+0

根據http://jira.mongodb.org/browse/SERVER-142,希望此功能有時會放入MongoDB中,但目前未計劃。現在手動過濾是最好的方法。 – Aea 2011-03-10 22:48:21

0

請在mongodb網站上閱讀Retrieving a Subset of Fields

我希望它能幫助你。

+0

感謝您的回答,但我不需要數組中的第一個或最後一個對象。我想要一個具有特殊值的對象。這個我不能用「$ slice」操作符來構建。我應該理解錯誤,否則請糾正我。 – Jarus 2011-03-09 21:49:43

+0

您可以通過點符號檢索部分子對象。 – 2011-03-09 22:02:08

相關問題