【问题标题】:The best way to get embedded documents in pymongo?在 pymongo 中获取嵌入式文档的最佳方法?
【发布时间】:2011-07-09 11:08:29
【问题描述】:

我在 MongoDB 中有这样的文档:

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

您可以看到关键的“页面”是一个包含其他文档的数组。现在我可以用一个页面的名称查询这个文档,我会得到包含所有页面和其他信息的完整文档。我在 python 中直接使用 pymongo 来查询文档,但现在我不知道从数组 pages 中获取页面的最佳方法是什么。我认为是这样的:

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

但这是获取单个页面或一般嵌入文档的最佳方式吗?欢迎所有提示或代码 sn-ps。

谢谢! 雅鲁斯

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    是的,你是对的。在 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'.
    

    比您需要遍历所有嵌入的文档找到您需要的页面。

    如果您经常需要加载嵌入式文档,那么您需要重新设计数据库(将页面移动到根集合,但在我看来,您的架构还可以)。

    【讨论】:

    【解决方案2】:

    请阅读 mongodb 网站上的Retrieving a Subset of Fields

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,但我不需要数组中的第一个或最后一个对象。我想要一个在其中一个键中具有特殊值的对象。到目前为止,我无法使用“$slice”运算符构建。如果我理解错了,请纠正我。
    • 您可以通过点表示法检索部分子对象。
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2010-09-23
    • 2020-03-23
    相关资源
    最近更新 更多