Arrays 如何在嵌套数组中进行查询。(使用pymongo)

Arrays 如何在嵌套数组中进行查询。(使用pymongo),arrays,mongodb,pymongo,Arrays,Mongodb,Pymongo,我是mongodb的新蜜蜂。 我制作了一个这样的嵌套数组文档 data = { "title": "mongo community", "description": "I am a new bee", "topics": [{ "title": "how to find object in array", "comments": [{ "description": "desc1" }] },

我是mongodb的新蜜蜂。 我制作了一个这样的嵌套数组文档

data = {
    "title": "mongo community",
    "description": "I am a new bee",
    "topics": [{
        "title": "how to find object in array",
        "comments": [{
            "description": "desc1"
        }]
    },
    {
        "title": "the case to use ensureIndex",
        "comments": [{
            "description": "before query"
        },
        {
            "description": "If you want"
        }
        ]
    }
    ]
}
之后,把它放到社区里 db.community.insertdata

所以,我想积累一些评论,主题是如何在数组中查找对象 然后我试着

data=db.community.find_one{title:mongo community,topics.title:how to find object in array}

结果是

>>> print data
{
    u 'topics': [{
        u 'comments': [{
            u 'description': u 'desc1'
        }],
        u 'title': u 'how to find object in array'
    },
    {
        u 'comments': [{
            u 'description': u 'before query'
        },
        {
            u 'description': u 'If you want'
        }],
        u 'title': u 'the case to use ensureIndex'
    }],
    u '_id': ObjectId('4e6ce188d4baa71250000002'),
    u 'description': u 'I am a new bee',
    u 'title': u 'mongo community'
}
我不需要案例中的主题来使用ensureIndex

你能给我些建议吗


thx.

看起来您正在将主题作为一个数组嵌入到一个文档中。您应该尽量避免频繁地从MongoDB返回部分文档。您可以使用find方法的fields参数来完成这项工作,但是如果您经常这样做的话,使用它并不容易

因此,要解决这个问题,您可以尝试将每个主题作为单独的文档。我想这对你来说也更容易。如果您想为论坛保存有关社区的信息,请将其放在单独的集合中。例如,您可以在monbodb shell中使用以下内容:

// ad a forum:
var forum = { 
                title:"mongo community",
                description:"I am a new bee"
            };
db.forums.save(forum);

// add first topic:
var topic = {
                title: "how to find object in array",
                comments: [ {description:"desc1"} ],
                forum:"mongo community"
            };
db.topics.save(topic);

// add second topic:
var topic = {
                title: "the case to use ensureIndex",
                comments: [ 
                    {description:"before query"},
                    {description:"If you want"}
                ],
                forum:"mongo community"
            };
db.topics.save(topic);

print("All topics:");
printjson(db.topics.find().toArray());


print("just the 'how to find object in array' topic:")
printjson(db.topics.find({title:"how to find object in array"}).toArray());

另外,请参阅有关MongoDB中模式设计的文档。它恰巧使用了与您正在使用的模式类似的模式,并对其进行了扩展以获得更高级的用例。

看起来您正在将主题作为一个数组嵌入到单个文档中。您应该尽量避免频繁地从MongoDB返回部分文档。您可以使用find方法的fields参数来完成这项工作,但是如果您经常这样做的话,使用它并不容易

因此,要解决这个问题,您可以尝试将每个主题作为单独的文档。我想这对你来说也更容易。如果您想为论坛保存有关社区的信息,请将其放在单独的集合中。例如,您可以在monbodb shell中使用以下内容:

// ad a forum:
var forum = { 
                title:"mongo community",
                description:"I am a new bee"
            };
db.forums.save(forum);

// add first topic:
var topic = {
                title: "how to find object in array",
                comments: [ {description:"desc1"} ],
                forum:"mongo community"
            };
db.topics.save(topic);

// add second topic:
var topic = {
                title: "the case to use ensureIndex",
                comments: [ 
                    {description:"before query"},
                    {description:"If you want"}
                ],
                forum:"mongo community"
            };
db.topics.save(topic);

print("All topics:");
printjson(db.topics.find().toArray());


print("just the 'how to find object in array' topic:")
printjson(db.topics.find({title:"how to find object in array"}).toArray());

另外,请参阅有关MongoDB中模式设计的文档。它恰巧使用了与您正在使用的模式类似的模式,并对其进行了扩展以获得更高级的用例。

MongoDB对文档进行操作,也就是说,顶级文档记录了您在其中保存、更新、插入、查找和查找的内容。Mongo的查询语言允许您在嵌入式对象中搜索,但始终会返回、更新或操作一个或多个顶级文档

MongoDB通常被称为无模式,但更像具有灵活模式或具有每文档模式的东西将是更准确的描述。在这种情况下,您的模式设计(将主题直接嵌入社区中)不适用于此特定查询。但是,该模式可能更有效地支持其他查询,例如在单个查询中列出社区中的主题。您可能需要考虑要做的查询并相应地重新设计模式。

关于MongoDB限制的几点注意事项:

正如@scott所指出的,顶级文档总是可以选择返回,只返回字段的子集-请参阅本主题的 从版本1.8+开始,每个文档的数据限制为16兆字节,因此如果社区有一长串主题,则此模式将无法正常工作
有关架构设计的帮助,请参阅和,以获取介绍、提示和注意事项。

MongoDB对文档进行操作,即顶级文档—您在其中保存、更新、插入、查找和查找的内容。Mongo的查询语言允许您在嵌入式对象中搜索,但始终会返回、更新或操作一个或多个顶级文档

MongoDB通常被称为无模式,但更像具有灵活模式或具有每文档模式的东西将是更准确的描述。在这种情况下,您的模式设计(将主题直接嵌入社区中)不适用于此特定查询。但是,该模式可能更有效地支持其他查询,例如在单个查询中列出社区中的主题。您可能需要考虑要做的查询并相应地重新设计模式。

关于MongoDB限制的几点注意事项:

正如@scott所指出的,顶级文档总是可以选择返回,只返回字段的子集-请参阅本主题的 从版本1.8+开始,每个文档的数据限制为16兆字节,因此如果社区有一长串主题,则此模式将无法正常工作
有关架构设计的帮助,请参阅和,以获取介绍、提示和注意事项。

Sure thing Tsutomu。关于这件事还有什么我可以回答的吗?如果是,请添加评论。如果所有的问题都得到了答案,如果你能将这个答案标记为答案,那就太好了。非常感谢斯科特!这似乎很简单。我自己解决不了这个问题。我相信MongoDB是一个丰富的文档。但我应该有效地使用它。再次感谢!很高兴这对你有帮助。请注意我们如何使用stackoverflow。为了让人们知道你的问题得到了回答,你可以把它标记为answe
单击该复选框,将显示红色。有关使用stackoverflow的更多信息,请访问.Sure thing Tsutomu。关于这件事还有什么我可以回答的吗?如果是,请添加评论。如果所有的问题都得到了答案,如果你能将这个答案标记为答案,那就太好了。非常感谢斯科特!这似乎很简单。我自己解决不了这个问题。我相信MongoDB是一个丰富的文档。但我应该有效地使用它。再次感谢!很高兴这对你有帮助。请注意我们如何使用stackoverflow。为了让人们知道您的问题已被回答,您可以通过单击复选框将其标记为已回答。有关使用stackoverflow的更多信息,请访问。非常感谢dcrosta,文档非常有用。非常感谢dcrosta,文档非常有用。