如何编写MongoDB查询,按过滤后的JSON对象数组长度返回文档
正确查询方案
你可以通过$expr搭配数组操作符直接实现需求,无需额外聚合阶段,将语句中的X替换为你需要的过滤后数组长度即可:
{ "$expr": { "$eq": [ { "$size": { "$filter": { "input": "$arrayProperty", "cond": { "$ne": ["$$this.turbo", "nil"] } } } }, X ] } }
逻辑说明
$filter遍历arrayProperty数组,仅保留turbo字段值不等于nil的元素$size统计过滤后数组的长度$expr支持在普通查询语句中使用聚合操作符,对比过滤后的数组长度和目标值X
如果需要兼容更低版本的MongoDB,也可以使用完整聚合管道实现:
db.collection.aggregate([ // 新增临时字段存储过滤后的数组 { "$addFields": { "filteredArray": { "$filter": { "input": "$arrayProperty", "cond": { "$ne": ["$$this.turbo", "nil"] } } } } }, // 匹配过滤后长度符合要求的文档 { "$match": { "filteredArray": { "$size": X } } }, // 可选:移除临时字段,返回原始文档结构 { "$project": { "filteredArray": 0 } } ])
之前写法失效的原因
你尝试的$ne写法无法生效,是因为$ne作用于数组字段时,只会判断整个数组是否完全不等于指定的对象/值,不会遍历数组元素校验内部字段,自然无法实现过滤数组内部元素的需求。
内容的提问来源于stack exchange,提问作者Will H
相关产品推荐
相关产品推荐

