在Mongo的对象层次结构中的任何位置查询具有值的键

时间:2014-09-22 09:24:00

标签: mongodb

在Mongo中,如何找到具有给定键和值的所有文档,无论该键在文档的键/值层次结构中出现在哪里?

例如,输入键roID和值5将匹配:

{
  roID: '5'
}

{
  other: {
    roID: '5'
  }
}

2 个答案:

答案 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) + ");"});