PyMongo - 查询嵌入式文档列表
问题描述:
这里有一些关于此的帖子,但并不完全是我所追求的。PyMongo - 查询嵌入式文档列表
我有一个包含嵌入的文件列表的文件:
{
"_id": 1234
"name": "joe"
"comments": [
{"type": "text", "content": "my content"},
{"type": "image", "content": "my_content"}
{"type": "image", "content": "my_content"}
]
}
我想运行一个查询得到一组文档,然后我希望能运行辅助查询搜索的“意见”来自该初始查询集的列表。
e.g p = db.people.find({"some":"condition"})
然后搜索嵌入文档一样p.find({"type":"image"}
这显然是行不通的。只是想知道是否有办法做到这一点,而无需再次对父文档集合运行2个单独的查询?
答
如果你只想找到一个集合,满足给定条件和也满足{"type": "image"}
的comments
数组中,你可以做,在一个查询中的项目:
p = db.people.find({"some": "condition", "comments.type": "image"})
见dot notation页面了解更多信息。
如果你确实需要整个事情,而且你对结果中的特定子项感兴趣,那么我能想到的最好的方法就是将结果塞进一个列表中,然后检查它在Python中。 PyMongo的大师有什么话要说吗?请注意,如果你的数据集很大,那么这是而不是的一个好主意。只使用find
用点号
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'])]
...
答
的问题是,您总能获得整份文件不仅子文档。
使用mongodb 2.2可以使用Aggregation。
注:$ElementMatch不使用时,与位置元素(something.$.someattribute
)迭代中,它只会匹配的第一个文件后退出,所以使用聚合得到的所有子文件匹配:)
谢谢。对不起,我应该提到我需要在列表中运行几个辅助查询,如“comments.type”:“image”,然后是“comments.type”:“其他”等,因此单个查询将无法工作。 – GivP
@GivP:我用一个想法做了一个快速编辑,虽然它可能不是最好的。 – voithos
是的,我认为这可能是最好的方法。这也是我最终做到的。谢谢。 – GivP