【问题标题】:Mongodb: find documents where at least one array element matches?Mongodb:查找至少一个数组元素匹配的文档?
【发布时间】:2013-03-02 00:08:55
【问题描述】:

我有一个具有以下结构的文档:

[{
    "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 中做到这一点?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您需要使用 $elemMatch 运算符:

    db.collection.find({items:
                         {$elemMatch:{
                               sent_to_lab:{$exists:true},
                               received_from_lab:{$exists:false}}
    })
    

    这是查询 $elemMatch - 如果您只想取回与条件匹配的项目(而不是整个文档与整个数组),那么您可以类似地使用投影 $elemMatch 运算符。

    【讨论】:

    • 这很有帮助,谢谢!在这种情况下,我实际上想要整个文档。但似乎我现有的查询是确保数组的 all 元素符合条件,而不是“一个或多个”
    • 实际上,不,这不是数组在 MongoDB 中的工作方式。您的查询说返回任何子文档已sent_to_lab 并且任何子文档没有收到_from_lab 的任何文档。这意味着您的查询将返回具有两个子文档的文档,一个具有已发送和已接收的现有文档,另一个不具有(!) elemMatch 将它们组合在一起,以便将它们应用于同一个子文档,这就是我对您的用例的理解。
    • 经过一番摆弄,我发现你是对的,$elemMatch 正是我要找的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2017-03-15
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    相关资源
    最近更新 更多