PyMongo - 查询嵌入文档列表

时间:2012-10-24 21:34:37

标签: python mongodb pymongo

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

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

{
   "_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个单独的查询?

2 个答案:

答案 0 :(得分:3)

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

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

有关详细信息,请参阅dot notation页面。

如果你确实需要整个事情,并且你对所述结果中的特定子项感兴趣,那么我能想到的最好的方法就是将结果插入到列表中,然后检查它蟒蛇。 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'])]

...

答案 1 :(得分:1)

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

使用mongodb 2.2可以使用Aggregation

look here

nb:$ElementMatch在与位置元素(something.$.someattribute)一起使用时不进行迭代,它将在第一个文档匹配后立即退出,因此使用聚合来获取匹配的所有子文档: )