Mongodb:查找至少匹配一个数组元素的文档?

5
我有一个结构如下的文档:
[{
    "items": [
        {
            "sent_to_lab": 123,
            "received_from_lab": 456,
        },
        {
            "sent_to_lab": 123,
        },
    ]
}
... more orders ...
]

我想获取所有订单,其中至少有一件物品符合以下条件:
'$and': [
    {'items.sent_to_lab': {'$exists': True}},
    {'items.received_from_lab': {'$exists': False}},
]

在这种情况下,我想要返回上述的项目,因为items数组中至少有一个元素符合我的条件。在Mongo中我该怎么做?
1个回答

11
您需要使用$elemMatch运算符:
db.collection.find({items:
                     {$elemMatch:{
                           sent_to_lab:{$exists:true},
                           received_from_lab:{$exists:false}}
})

这是查询 $elemMatch - 如果您只想获取符合条件的项目(而不是带有整个数组的完整文档),则可以使用投影 $elemMatch 运算符类似地进行操作。

非常有帮助,谢谢!在这种情况下,我实际上想要整个文档。但是似乎我的现有查询确保数组的所有元素都符合条件,而不是“一个或多个”。 - poundifdef
实际上,这不是 MongoDB 中数组的工作方式。您的查询语句表示返回任何具有 sent_to_lab 子文档且没有 received_from_lab 子文档的文档。这意味着您的查询将返回具有两个子文档的文档,一个具有已存在的 sent 和 received,另一个则没有(!)。elemMatch 将它们组合在一起,以便它们应用于同一个子文档,这就是我理解您的用例的方式。 - Asya Kamsky
经过一些尝试,我发现你是正确的,$elemMatch正是我正在寻找的。非常感谢。 - poundifdef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接