2011-03-05 139 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

相关问题