【问题标题】:A MongoDB find() that matches when all $and conditions match the same sub-document?当所有 $and 条件匹配相同的子文档时匹配的 MongoDB find()?
【发布时间】:2014-08-02 23:33:42
【问题描述】:

如果我有一组如下所示的 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”。这些条件在不同的食物子文档中匹配。我希望它们在食品文件上成对匹配。

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

【问题讨论】:

    标签: mongodb find subdocument


    【解决方案1】:

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

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

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

    【讨论】:

    • 奖励积分不仅是正确的,而且是快速的。 13 分钟。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2017-08-21
    • 1970-01-01
    • 2018-06-13
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多