MongoDB在集合中的列表中搜索每个dict

时间:2014-10-08 16:23:53

标签: python mongodb mongodb-query pymongo

我的collection包含list dicts,我想搜索是否有任何dict包含两个特定的key:values

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

{
"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的一条记录?

3 个答案:

答案 0 :(得分:4)

虽然提到确实不需要$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"和"琼斯"然后那将不匹配,因为没有元素实际包含该操作。

答案 1 :(得分:0)

几乎!

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

您需要将问题分成单独的{}括号。

答案 2 :(得分:0)

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

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