【问题标题】:MongoDB search for each dict in list in collectionMongoDB在集合中搜索列表中的每个字典
【发布时间】:2014-12-03 09:36:19
【问题描述】:

我有一个 collection 包含 listdicts 并且我想搜索是否有任何字典包含两个特定的 key:values

例如,我想find_one,其中字典包含特定的名字和姓氏。这是我的收藏:

{
"names": [
    {
        "firstName": "bob",
        "lastName": "jones",
        "age": "34",
        "gender": "m"
    },
    {
        "firstName": "alice",
        "lastName": "smith",
        "age": "56",
        "gender": "f"
    },
    {
        "firstName": "bob",
        "lastName": "smith",
        "age": "19",
        "gender": "m"
    },          
  ]
}

我想看看是否有以 bob smith 作为名字和姓氏的记录,我正在搜索:

first = 'bob'
last = 'smith'

nameExists = db.user.find_one({'$and':[{'names.firstName':first,'names.lastName':last}]})

此查询会检索 bob smith 的一条记录吗?

【问题讨论】:

    标签: python mongodb mongodb-query pymongo


    【解决方案1】:

    几乎!

     nameExists = db.user.find_one({'$and':[{'names.firstName':first},{'names.lastName':last}]})
    

    您需要将问题分隔到单独的 {} 括号中。

    【讨论】:

      【解决方案2】:

      您甚至不需要添加 $and 参数。在 mongoDB 中,查询中的逗号分隔字段由 implicit AND operator 连接,因此在 find_one 中只需使用 {'names.firstName':first,'names.lastName':last} 即可。

      无论如何,这只是一个“干净的代码”修复;当您只使用一个元素执行“与”操作时,您的代码将正常工作(请注意,用于参数 $and 的列表仅包含一个字典)。

      【讨论】:

        【解决方案3】:

        虽然提到确实不需要$and 运算符,但无论哪种形式,这都不是您想要的查询。考虑以下几点:

        db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
        

        这实际上确实匹配给定的记录,因为有两个元素的“firstName”等于“alice”,“lastName”的值等于“jones”。但当然,这里的问题很简单,因为数组中没有实际元素具有这两个值的子文档。

        为了匹配一个数组元素包含“两个”给定条件的位置,您需要使用$elemMatch 运算符。这会将查询条件应用于数组的“元素”。

        db.user.find_one({ 
            'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
        })
        

        当然,如果您尝试了“alice”和“jones”,那么这将不匹配,因为没有元素实际上包含该操作。

        【讨论】:

        • 谢谢,这就是我想要匹配一个特定的子文档。我也会阅读$elemMatch
        • 如果您打算只返回匹配的单个元素,请参阅 positional $ 运算符文档。
        • 谢谢,我去看看。
        猜你喜欢
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 2021-04-17
        相关资源
        最近更新 更多