2014-10-08 94 views
2

我有一个collection包含listdicts我想搜索,如果任何字典包含两个特定的key:valuesMongoDB搜索集合中的每个字典

因此,例如我想要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" 
    },   
    ] 
} 

我想看看是否有与鲍勃·史密斯的纪录是第一个和最后的名字,我正在寻找此为:

first = 'bob' 
last = 'smith' 

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

这会查询检索的一个记录鲍勃史密斯?

回答

4

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

db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' }) 

这实际上确实因为有与“名字”等于“爱丽丝”和“姓氏”值这两个元素等于“琼斯”匹配给定的记录。但是,当然这里的问题很简单,因为数组中没有实际的元素,它们都有一个用于这两个值的子文档。

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

db.user.find_one({ 
    'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' } 
}) 

当然,如果你尝试过“爱丽丝”和“琼斯”那么这将不匹配,因为没有元素实际上包含该操作。

+0

感谢这就是我想要的只是匹配一个特定的子文档。我也会读''elemMatch'。 – user94628 2014-10-09 11:25:33

+1

如果您的意图是仅返回匹配的单个元素,请参阅[位置'$'](http://docs.mongodb.org/manual/reference/operator/projection/positional/)运算符文档。 – 2014-10-09 12:48:00

+0

谢谢我会看看那个。 – user94628 2014-10-09 19:53:31

0

差不多!

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

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

0

你甚至不需要添加$和参数。在mongoDB中,查询中逗号分隔的字段由implicit AND operator连接,因此在find_one内部只需使用{'names.firstName':first,'names.lastName':last}就可以工作。

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