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