这里有一些关于此的帖子,但不完全是我所追求的。
我有一个包含嵌入文档列表的文档:
{
"_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个单独的查询?
答案 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。
nb:$ElementMatch在与位置元素(something.$.someattribute
)一起使用时不进行迭代,它将在第一个文档匹配后立即退出,因此使用聚合来获取匹配的所有子文档: )