您可以使用JavaScript对$where子句的评估在任意深度执行此操作:
db.collection.find(
function () {
var findKey = new RegExp("^start");
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return findKey.test(key);
}
});
}
return inspectObj(this);
}
)
Run Code Online (Sandbox Code Playgroud)
或者,如果你有MongoDB 3.4并且只查看文档的"顶层"级别,你可以使用.aggregate()和$objectToArray:
db.collection.aggregate([
{ "$addFields": {
"finder": { "$objectToArray": "$$ROOT" }
}},
{ "$match": { "finder.k": /^start/ } }
])
Run Code Online (Sandbox Code Playgroud)
这是因为$objectToArray需要一个"对象"和转换成对象的数组连键"k"和"v"用于每个所提供的对象的"键"和"值".我们可以使用这个来完成整个文档$$ROOT.因此,我们基本上将"密钥"转换为可以搜索的"数据".
通过转换数据,您可以使用简单的"点表示法"和常规$regex查询表达式来匹配"键"的值.
因此,聚合方法最适用于"平面"文档,或处理"已知深度",并且JavaScript方法最适用于可以在任何级别嵌套密钥的情况.
归因于:如何在任意深度找到 JavaScript版本搜索的基本部分的MongoDB字段名称.仅针对正则表达式进行了修改.
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |