3

如果我有一组如下所示的 MongoDB 文档,我该怎么做才能得到一个 find() 结果,它只返回有 2 只宠物都喜欢肝脏的家庭?

这是我期望的工作:

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 的真实食物。如果任何食物子文档匹配,则 $and 中的两个条件似乎为真,但我想要的是两个条件作为一对匹配条件。

照原样,我让琼斯一家回来(如我所愿),但也让史密斯(我没有)。Smith 被返回是因为 chicken 子文档的 allLike 设置为 true,并且liver 子文档的名称为“liver”。这些条件在不同的食物子文档中匹配。我希望它们在食品文件上成对匹配。

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

4

1 回答 1

4

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

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

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

于 2014-06-12T15:20:45.443 回答