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

Mongodb Mongo中对象层次结构中任意位置具有值的查询键,mongodb,Mongodb,在Mongo中,如何找到具有给定键和值的所有文档,而不管该键在文档的键/值层次结构中出现在何处 例如,输入键roID和值5将同时匹配: { roID: '5' } 及 没有内置的方法可以做到这一点。您可能必须递归地扫描每个匹配的文档,以尝试定位该属性不推荐使用。您可能需要考虑重新构造数据,或者将其转换为更统一的格式,以便查询更容易(更快) 如果您所需的钥匙出现在固定数量的不同位置,您可以使用$或操作符扫描所有可能的位置 以示例文档为例,您的查询如下所示: db.data.find( {

在Mongo中,如何找到具有给定键和值的所有文档,而不管该键在文档的键/值层次结构中出现在何处

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

{
  roID: '5'
}


没有内置的方法可以做到这一点。您可能必须递归地扫描每个匹配的文档,以尝试定位该属性不推荐使用。您可能需要考虑重新构造数据,或者将其转换为更统一的格式,以便查询更容易(更快)


如果您所需的钥匙出现在固定数量的不同位置,您可以使用
$或
操作符扫描所有可能的位置

以示例文档为例,您的查询如下所示:

db.data.find( { "$or": [
  { "roID": 5 },
  { "other.roID": 5 },
  { "foo.bar.roID": 5 },
  { any other possbile locations of roID },
  ...
] } )

如果收集的文档数量不太多,则可以通过以下方法完成:

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

我相信你会理解你的要求效率低下。您必须递归地扫描每个文档,以尝试定位该属性。更好的问题是解释您的实际用例,以及为什么您“认为”需要以这种方式建模。这给了人们一些东西,让他们根据“真正的解决方案”来做你想做的事情。但是,在任何深度都没有简单的方法可以做到这一点,而不需要在JavaScript代码中遍历文档。因此,您可能需要一个新的结构来解决您的问题problem@Lix是的,你说得对。我相信有更好的方法来实现我的目标。是的,固定地点路线更有意义。我想我希望有一个内置的方法来摆脱懒惰。
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) + ");"});