如果我有一组像下面这样的MongoDB文件,我该怎样做才能获得一个只返回有2只宠物的家庭的find()结果呢?
这是我期望的工作:
db.delegation.find({pets:2, $and: [{'foods.liver': true}, {'foods.allLike': true}] })
以下是文件集:
{
"_id" : ObjectId("5384888e380efca06276cf5e"),
"family": "smiths",
"pets": 2,
"foods" : [
{
"name" : "chicken",
"allLike" : true,
},
{
"name" : "liver",
"allLike" : false,
}
]
},
{
"_id" : ObjectId("4384888e380efca06276cf50"),
"family": "jones",
"pets": 2,
"foods" : [
{
"name" : "chicken",
"allLike" : true,
},
{
"name" : "liver",
"allLike" : true,
}
]
}
我最终得到的是两个家庭,因为他们都至少有一种食物被标记为真正的allLike。看来$和$中的两个条件是真的,如果任何食物子文档匹配,但我想要的是两个条件匹配条件作为一对。
按原样,我让琼斯家族回来(我想要),但史密斯(我没有)。史密斯被归还,因为鸡子医生将allLike设置为true,肝脏子医生的名称为“肝脏”。条件匹配不同的食品子文档。我希望他们在食品文件上配对。
显然,这段代码不是真正的用例。我有一个,但我已经简化它以保护无辜......
答案 0 :(得分:4)
这是$elemMatch
运算符的理想用例,它匹配数组元素中的多个组件:
db.delegation.find({pets:2, foods: { $elemMatch: {name: 'liver', allLike: true}}})
另一方面,$and
运算符不适合此处,因为它可以匹配数组中不同的元素。