通过下面的文档集合,我需要找到特定字段的文档 - 例如.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:速度不是我主要考虑的问题,我可以使用相对慢一点的选项,因为主要功能是找到符合所讨论标准的文档,一旦找到文档并理解了模式,查询就可以了通过包含父键来重写性能.
要搜索嵌套文档中的键,需要递归迭代文档字段,可以通过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)
| 归档时间: |
|
| 查看次数: |
1477 次 |
| 最近记录: |