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"
        }
    }
}

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

update2:速度不是我主要关心的问题,我也可以使用相对较慢的选项,因为主要功能是查找符合讨论标准的文档,一旦文档被找到并理解架构后,可以通过包含父键来重写查询以提高性能。

最佳答案

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

我已经用你给出的例子检查了这个,它工作得很好。

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

);

https://stackoverflow.com/questions/42036982/

相关文章:

ruby-on-rails - MongoDB 的最佳分析/数据可视化库

mongodb - 在集合之间移动文档是表示 MongoDB 中状态变化的好方法吗?

performance - 字段类型在 MongoDB 索引中是否重要?

mongodb - 可以在 MongoDB 查询中使用严格的 JSON $dates 吗?

javascript - MongoError : cannot change _id of a d

javascript - Mongoose 连接到 MongoDB Atlas 的最佳池大小是多少?

javascript - 在 MongoDB 中按字母顺序对文档进行排序(也称为自然排序顺序,人类排

mongodb - 在mongo聚合中将ObjectID转换为字符串

mongodb - Spark 流 : foreachRDD update my mongo RDD

mongodb - Azure:不支持 DocumentDB Mongo $group