MongoDB聚合$project阶段用$filter筛选无flag字段元素报错
问题解决:MongoDB聚合筛选数组中无指定字段的元素
错误原因
你报错是因为聚合表达式里没有$exists操作符,$exists是MongoDB查询语法(比如find())里的用法,聚合管道的条件判断得用聚合专用表达式。
正确聚合语句
方法1:使用$hasField(MongoDB 4.2+支持)
$hasField可直接判断文档是否包含指定字段,结合$not就能筛选出没有flag字段的元素:
db.collection.aggregate([ { "$project": { "_id": 0, "price": 1, "subGenre": { "$getField": { "field": "subGenre", "input": { "$first": { "$filter": { input: "$data", cond: { "$not": [{ "$hasField": ["$$this", "flag"] }] } } } } } } } } ])
方法2:兼容旧版本(MongoDB <4.2)
如果你的MongoDB版本低于4.2,可利用**不存在的字段访问后返回null**的特性,用$eq判断$$this.flag是否为null:
db.collection.aggregate([ { "$project": { "_id": 0, "price": 1, "subGenre": { "$getField": { "field": "subGenre", "input": { "$first": { "$filter": { input: "$data", cond: { "$eq": ["$$this.flag", null] } } } } } } } } ])
结果说明
两种方法都会筛选出data数组中无flag字段的元素,通过$first取第一个匹配项(此处仅jumpScare符合),再用$getField提取subGenre字段,最终输出:
{ price: 10210.6, subGenre: "jumpScare" }
内容的提问来源于stack exchange,提问作者Roomi
相关产品推荐
相关产品推荐

