在Mongo中,如何找到具有给定键和值的所有文档,无论该键在文档的键/值层次结构中出现在哪里?
例如,输入键roID
和值5
将匹配:
{
roID: '5'
}
和
{
other: {
roID: '5'
}
}
答案 0 :(得分:1)
没有内置方法可以做到这一点。您可能必须递归扫描每个匹配的文档以尝试找到该属性。 不推荐。您可能想要考虑重构数据或者将其操作为更统一的格式,以便查询更容易(也更快)。
如果您所需的密钥出现在固定数量的不同位置,您可以使用$or
运算符扫描所有可能性。
以您的示例文档为例,您的查询将如下所示:
db.data.find( { "$or": [
{ "roID": 5 },
{ "other.roID": 5 },
{ "foo.bar.roID": 5 },
{ any other possbile locations of roID },
...
] } )
答案 1 :(得分:1)
如果集合中的文档数量不是很大,那么可以通过以下方式完成:
db.system.js.save({_id:"keyValueExisted", value: function (key, value) {
function findme(obj) {
for (var x in obj) {
var v = obj[x];
if (x == key && v == value) {
return true;
} else if (v instanceof Object) {
if (findme(v)) return true;
}
}
return false;
}
return findme(this);
}});
var param = ['roID', '5'];
db.c.find({$where: "keyValueExisted.apply(this, " + tojsononeline(param) + ");"});