【问题标题】:PyMongo - Querying list of embedded documentsPyMongo - 查询嵌入文档列表
【发布时间】:2020-01-28 18:14:22
【问题描述】:

这里有一些关于这个的帖子,但不完全是我想要的。

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

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

}

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

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

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

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

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

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

    请参阅dot notation 页面了解更多信息。

    如果您确实需要整个内容,并且您对所述结果中的特定子项感兴趣,那么我能想到的最好方法就是将结果放入列表中,然后将其签入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'])]
    
    ...
    

    【讨论】:

    • 谢谢。抱歉,我应该提到我需要在列表上运行几个辅助查询,例如 "cmets.type": "image" 然后 "cmets.type": "something else" 等,因此单个查询不起作用。
    • @GivP:我用一个想法进行了快速编辑,虽然它可能不是最好的。
    • 是的,我认为这可能是最好的方法。这也是我最终这样做的方式。谢谢。
    【解决方案2】:

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

    使用 mongodb 2.2 可以使用Aggregation

    look here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2022-10-21
      • 2012-08-22
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多