当父字段未知时,在嵌套文档中查找包含字段的记录

use*_*440 16 mongodb

通过下面的文档集合,我需要找到特定字段的文档 - 例如.lev3_field2(在下面的文件中)存在.

我尝试了以下内容,但这并没有返回任何结果,尽管lev3_field2 某些文档中存在该字段.

db.getCollection('some_collection').find({"lev3_field2": { $exists: true, $ne: null } })

{
    "_id" : ObjectId("5884de15bebf420cf8bb2857"),
    "lev1_field1" : "139521721",
    "lev1_field2" : "276183",
    "lev1_field3" : {
        "lev2_field1" : "4",
        "lev2_field2" : {
            "lev3_field1" : "1",
            "lev3_field2" : {
                "lev4_field1" : "1",
                "lev4_field2" : "1"
            },
            "lev3_field3" : "5"
        },
        "lev2_field3" : {
            "lev3_field3" : "0",
            "lev3_field4" : "0"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

update1:这是一个示例,但是在真实文档中,不知道要查找的字段的父字段是什么.所以,而不是lev3_field2,我会寻找`levM_fieldN'.

update2:速度不是我主要考虑的问题,我可以使用相对慢一点的选项,因为主要功能是找到符合所讨论标准的文档,一旦找到文档并理解了模式,查询就可以了通过包含父键来重写性能.

Pun*_*ngh 9

要搜索嵌套文档中的键,需要递归迭代文档字段,可以通过MongoDB 中$ where方法的帮助在JavaScript中执行此操作.下面的查询将搜索文档及其子文档中是否存在键名.

我已经用你给出的例子检查了这个,并且它工作得非常好.

db.getCollection('test').find({ $where: function () {
    var search_key = "lev3_field2";

    function check_key(document) {
      return Object.keys(document).some(function(key) {
        if ( typeof(document[key]) == "object" ) {
            if ( key == search_key ) {
                return true;
            } else {
                return check_key(document[key]);
            }
        } else {
          return ( key == search_key );
        }
      });
    }
    return check_key(this);
  }}

);
Run Code Online (Sandbox Code Playgroud)