MongoDB聚合$filter查询报错:如何正确筛选无指定字段的子文档
解决MongoDB聚合$filter中筛选未删除版本的语法问题
嘿,我明白你遇到的问题了!你写的聚合查询出错,是因为在$filter的cond条件里误用了MongoDB普通查询的语法格式。
在聚合管道的表达式环境中,判断字段是否存在不能像普通find查询那样写{'$$version.delete': {$exists: false}},而是要使用聚合专用的$exists操作符,它的语法是{$exists: [字段路径, 是否存在的布尔值]}。
正确的聚合查询语句
db.getCollection('test').aggregate([ {$project: { versions: { $filter: { input: '$versions', as: 'version', cond: { $or: [ {$gte: ['$$version.delete', 3]}, {$exists: ['$$version.delete', false]} // 这里修正了字段存在性的判断语法 ] } } } }} ])
为什么这样写是对的?
这个查询会正确筛选出versions数组中符合以下任一条件的元素:
- 存在
delete字段,且字段值大于等于指定时间戳(示例中是3) - 完全不存在
delete字段(即未被标记删除)
内容的提问来源于stack exchange,提问作者kamil herba
相关产品推荐
相关产品推荐

