MongoDB在集合列表中搜索每个字典

use*_*628 2 python mongodb pymongo mongodb-query

我有一个collection包含的listdicts我想搜索是否有dict包含两个特定的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"
    },          
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想查看是否有以鲍勃·史密斯为名字和姓氏的记录,我将其搜索为:

first = 'bob'
last = 'smith'

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

此查询会检索鲍勃·史密斯的一条记录吗?

Nei*_*unn 5

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

db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Run Code Online (Sandbox Code Playgroud)

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

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

db.user.find_one({ 
    'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Run Code Online (Sandbox Code Playgroud)

当然,如果您尝试使用“ alice”和“ jones”,则不会匹配,因为没有元素实际包含该操作。