在MongoDB中查询嵌入文档中至少一个(列表的)键

时间:2015-04-16 17:20:54

标签: mongodb mongodb-query

我在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()示例一样。

2 个答案:

答案 0 :(得分:1)

你可以做一些与你想要的事情相反的事情。如果您希望获得至少包含一个密钥的attrs,则可以使用mongo的$ne -

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

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

答案 1 :(得分:1)

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

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