当所有$和条件匹配相同的子文档时,MongoDB find()匹配?

时间:2014-06-12 15:07:24

标签: mongodb find subdocument

如果我有一组像下面这样的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,肝脏子医生的名称为“肝脏”。条件匹配不同的食品子文档。我希望他们在食品文件上配对。

显然,这段代码不是真正的用例。我有一个,但我已经简化它以保护无辜......

1 个答案:

答案 0 :(得分:4)

这是$elemMatch运算符的理想用例,它匹配数组元素中的多个组件

db.delegation.find({pets:2, foods: { $elemMatch: {name: 'liver', allLike: true}}})

另一方面,$and运算符不适合此处,因为它可以匹配数组中不同的元素。