MongoDB如何匹配任意嵌套字段下end_flag为true的文档
解决方案
错误原因说明
- 你第一种写法默认是AND逻辑,必须所有列出的
X.end_flag都为true才会命中文档,不符合「任意一个为true即命中」的要求 - 第二种
$in的用法错误,普通$match查询中不能直接用$字段名的方式引用文档字段值,需要搭配$expr才能使用字段引用语法
可行实现方案
方案1:已知所有X的取值(比如你的场景里是1~10)
该方案查询效率最高,直接用$or组合所有条件即可:
[ { "$match": { "$or": [ {"1.end_flag": true}, {"2.end_flag": true}, {"3.end_flag": true}, {"4.end_flag": true}, {"5.end_flag": true}, {"6.end_flag": true}, {"7.end_flag": true}, {"8.end_flag": true}, {"9.end_flag": true}, {"10.end_flag": true} ] } }, // 统计符合条件的文档总数,添加该阶段即可 { "$count": "matched_doc_count" } ]
方案2:未知X的取值、键名不固定
如果不确定文档下有多少个数字键、无法穷举的话,可以用$objectToArray把根文档的键值对转成数组,再判断数组中是否存在符合条件的元素:
[ { "$match": { "$expr": { "$gt": [ { "$size": { "$filter": { "input": {"$objectToArray": "$$ROOT"}, "cond": {"$eq": ["$$this.v.end_flag", true]} } } }, 0 ] } } }, { "$count": "matched_doc_count" } ]
内容的提问来源于stack exchange,提问作者emremrah
相关产品推荐
相关产品推荐

