我的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的一条记录?
答案 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}将起作用。
无论如何,这只是一个“干净的代码”修复;当您使用一个元素执行“和”操作时,您的代码将正常工作(请注意,用于参数$的列表仅包含一个字典)。