3

这里有一些关于此的帖子,但不完全是我所追求的。

我有一个包含嵌入文档列表的文档:

{
   "_id": 1234
   "name": "joe"
   "comments": [
       {"type": "text", "content": "my content"},
       {"type": "image", "content": "my_content"}
       {"type": "image", "content": "my_content"}
   ]

}

我想运行一个获取一组文档的查询,然后我希望运行一个辅助查询来搜索该初始查询集中的“评论”列表。

例如p = db.people.find({"some":"condition"}),然后搜索嵌入式文档,例如p.find({"type":"image"}

这显然是行不通的。只是想知道是否有办法做到这一点而不必再次对父文档集合运行 2 个单独的查询?

4

2 回答 2

4

如果您只想在集合中找到满足给定条件并在数组中满足的项目{"type": "image"}您可以comments在单个查询中执行此操作:

p = db.people.find({"some": "condition", "comments.type": "image"})

有关更多信息,请参阅点符号页面。

如果您确实需要整个内容,并且您对所述结果中的特定子项感兴趣,那么我能想到的最好的方法就是将结果放入列表中,然后在 Python 中进行检查。任何 PyMongo 大师对此有什么要说的吗?请注意,如果您的数据集很大,那么这不是一个好主意。

p = list(db.people.find({"some": "condition"})

# A little verbose, but...
image_p = [item for item in p
           if any(comment['type'] == 'image'
                  for comment in item['comments'])]

...
于 2012-10-24T21:53:08.910 回答
1

find使用点符号的问题是您将始终获得整个文档而不仅仅是子文档。

使用 mongodb 2.2 能够使用Aggregation

看这里

注意:$ElementMatch与位置元素( )一起使用时不会迭代something.$.someattribute,它会在第一个匹配的文档后退出,所以使用聚合来获取所有匹配的子文档:)

于 2012-10-24T22:38:22.867 回答