2012-10-24 112 views
3

这里有一些关于此的帖子,但并不完全是我所追求的。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个单独的查询?

回答

3

如果你只想找到一个集合,满足给定条件和满足{"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'])] 

... 
+0

谢谢。对不起,我应该提到我需要在列表中运行几个辅助查询,如“comments.type”:“image”,然后是“comments.type”:“其他”等,因此单个查询将无法工作。 – GivP

+0

@GivP:我用一个想法做了一个快速编辑,虽然它可能不是最好的。 – voithos

+0

是的,我认为这可能是最好的方法。这也是我最终做到的。谢谢。 – GivP

1

的问题是,您总能获得整份文件不仅子文档。

使用mongodb 2.2可以使用Aggregation

look here

注:$ElementMatch不使用时,与位置元素(something.$.someattribute)迭代中,它只会匹配的第一个文件后退出,所以使用聚合得到的所有子文件匹配:)