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
。如果您的目的是只返回匹配的单个元素,请参阅操作员文档。谢谢,我将查看一下。