【问题标题】:How to combine $in and $elemMatch properly with MongoDB (PyMongo)如何将 $in 和 $elemMatch 与 MongoDB (PyMongo) 正确结合
【发布时间】:2019-10-27 01:21:30
【问题描述】:

在我的数据库中,我根据以下方案存储了数据:

{'_id': ...,
 'names': [{'first': ...,
            'last': ...},
           {'first': ...,
            'last': ...},
           ...
           ],
...
}

现在,在我的程序中,我根据以下方案得到一个名称列表:

name_list = [(first_name1, last_name1), (first_name2, last_name2), ...]

我想要的是找到所有在name_list 中找到的名字/姓氏的任何组合都包含在names 数组中的所有文档。

如果我只有一个名字要检查(而不是列表),我会使用以下查询:

query = {'names':
                 {'$elemMatch':
                      {'first_name': first_name,
                       'last_name': last_name}
                  }}

所以我可以为列表中的每个名称提供此查询,执行以下操作:

all_results = []
for first_name, last_name in name_list:
    rv := # Result from query
    # combine all_results and rv

但我觉得应该有更好的方法来做到这一点。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    可以使用 $or$elemMatchname_list 创建多元素匹配查询,这可以找到匹配第一个/最后一个组合的文档。

    查询:考虑到name_list

    //[(first_name1, last_name1), (first_name2, last_name2), (first_name3, last_name3)]
    
    db.collection.find({
      $or: [
        {
          names: {
            $elemMatch: {
              first: "first_name1",
              last: "last_name1"
            }
          }
        },
        {
          names: {
            $elemMatch: {
              first: "first_name2",
              last: "last_name2"
            }
          }
        },
        {
          names: {
            $elemMatch: {
              first: "first_name3",
              last: "last_name3"
            }
          }
        }
      ]
    });
    

    【讨论】:

    • 这是最典型的做法吗?我之前遇到过这个解决方案,但是生成这样的查询,尤其是可能有 200 个名字的长查询,感觉有点恶心。
    • 曾考虑过name_list 非常大并且最初想在first_namelast_name 字段的扁平数组上使用$in 操作,但这确实得到了结果,因为它会得到结果交叉组合也不仅仅是对。 通过交互和准备查询对象(即使很大),让代码为您工作。您也可以等待其他可能比这更好的答案出现并分析。
    • 我的意思是在上面的评论中没有完全得到结果:p
    猜你喜欢
    • 2013-11-24
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2016-11-15
    • 2017-07-03
    相关资源
    最近更新 更多