使用包含以下文档的集合,我需要找到特定字段所在的文档 - 例如。 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转换为字符串