Python MongoDB搜索集合中列表中的每个dict
我有一个Python MongoDB搜索集合中列表中的每个dict,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我有一个集合包含目录的列表,我想搜索任何目录是否包含两个特定的键:值 例如,我想找到一个,其中一个dict包含一个特定的名字和姓氏。这是我的收藏: { "names": [ { "firstName": "bob", "lastName": "jones", "age": "34", "gender": "m" }, { "firstName": "alice", "lastN
集合
包含目录的列表
,我想搜索任何目录是否包含两个特定的键:值
例如,我想找到一个
,其中一个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检索到一条记录吗?差不多了
nameExists = db.user.find_one({'$and':[{'names.firstName':first},{'names.lastName':last}]})
您需要将任务分隔成单独的{}括号。您甚至不需要添加$and参数。在mongoDB中,查询中以逗号分隔的字段由一个连接,因此在find_one中只需使用{'names.firstName':first、'names.lastName':last}即可
无论如何,这只是一个“干净的代码”修复;当您仅使用一个元素执行“and”操作时,代码将正常工作(请注意,用于参数$and的列表只包含一个字典) 虽然提到确实不需要运算符,但无论是哪种形式,这都不是您想要的查询。考虑以下事项:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
这实际上与给定的记录匹配,因为有两个元素的“firstName”值等于“alice”,而“lastName”值等于“jones”。当然,这里的问题很简单,因为数组中没有实际的元素为这两个值都包含子文档
为了匹配数组元素包含“两个”给定条件的位置,需要使用运算符。这将查询条件应用于数组的“元素”
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
当然,如果您尝试使用“alice”和“jones”,那么这将不匹配,因为实际上没有任何元素包含该操作。谢谢,这正是我想要匹配的一个子文档。我还将阅读$elemMatch
。如果您的目的是只返回匹配的单个元素,请参阅操作员文档。谢谢,我将查看一下。