【问题标题】:Query for at least one key (of a list) in embedded document in MongoDB在 MongoDB 的嵌入式文档中查询至少一个键(列表中的)
【发布时间】:2015-04-17 03:39:51
【问题描述】:

我在 MongoDB 的一个集合中有这样的文档(让我们调用 x):

{
    "_id" : ...,
    "attrs" : {
        "A2" : {
            "type" : "typeA",
            "value" : "12.2"
        },
        "A3" : {
            "type" : "typeB",
            "value" : "34"
        }
    }
}

换句话说,它们是具有attr 字段的文档,该字段的值是嵌入文档,其中包含任意数量的键(在示例中显示了 A2 和 A3 键)。

给定一个潜在键的列表(例如 A1、A2、A3),​​我想要一个查询来获取在给定列表中具有至少一个键的所有文档。我的第一个想法是使用:

db.x.find({"attrs": {$in:[ "A1", "A2", "A3" ]})

但它不起作用。

我找到了一个通过以下方式解决问题的查询:

db.x.find({$or: [ {"attrs.A1": {$exists: true }}, 
                  {"attrs.A2": {$exists: true }}, 
                  {"attrs.A3": {$exists: true }} ] })

不过,我想知道是否有更好、更“紧凑”的解决方案,比如第一个 find() 示例不起作用。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    你可以做一些与你想要的相反的事情。如果你想得到attrs 里面至少有一个key,你可以使用$ne of mongo like-

    db.collection.find({"attrs":{$ne:{}}})
    

    通过检查attrs 是否为空,您可以获得所需的结果。 希望这对你有用。

    【讨论】:

    • 不完全...我想要的是获取所有在 给定列表 中至少具有一个键的文档(在该列表的帖子示例中是:A1、A2 和 A3)。我的意思是,不是至少有一个 whatever 键的文档。我已经编辑了帖子以使其更清晰。感谢您的反馈!
    【解决方案2】:

    您可以使用$where 运算符和Array.prototype.some() 方法。

    db.collection.find({ $where: function(){ 
            return Object.keys(this.attrs).some(function(elt){ 
                return ( ["A1", "A2", "A3"].indexOf(elt) != -1 ); }) 
            }
        }
    )
    

    【讨论】:

    • 感谢您的反馈!该查询将解决问题,但不鼓励使用 $where (docs.mongodb.org/manual/reference/operator/query/where:“只有在无法使用其他运算符表达查询时才应使用 $where”)
    • @fgalan 我知道$where 运算符的使用。 :) 现在,如果您想检查 attrs 字段与您从另一个应用程序收到的一千个元素的数组,该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2018-03-20
    • 2022-10-21
    • 1970-01-01
    • 2015-02-06
    • 2021-03-24
    相关资源
    最近更新 更多