MongoDB聚合查询:用计算字段过滤后移除该字段的方法
问题原因
你碰到的这个错误,是因为MongoDB的$project阶段有严格规则:不能在包含式投影(指定保留字段,如v:1、t:1)里混合使用字段排除(test:0),唯一例外是_id字段可以单独排除。你最后一个$project同时写了保留v、t和排除test,违反了这个规则,所以报错。
解决办法
给你三种可行的方案,按需选择:
方案1:修改最后一个$project,只保留需要的字段
既然明确要保留v和t,直接列出这两个字段即可,MongoDB会自动移除其他未指定的字段(包括test)。如果不需要默认返回的_id,可以加上_id:0:
{ "$project":{ "v":1, "t":1, "_id":0 // 可选,不需要_id就添加这行 } }
方案2:用$unset替代最后一个$project
$unset是专门用来移除字段的操作,比$project更直观,不会有投影规则冲突。把最后一个$project换成:
{ "$unset": "test" }
方案3:优化整个聚合管道(推荐)
原管道里有重复的$match,还拆分了字段计算和投影,可以合并优化让管道更高效:
db.raw_iot_data.aggregate([ { "$match":{ "m.i": "cycle-time" } }, { "$addFields":{ "date":{ "$dateFromString":{ "dateString": "2022-03-17T01:02:24.367Z" } }, "test": { "$cond":[ { "$gte": ["$t", "$date"] }, 1, 0 ] } } }, { "$match":{ "test": 1 } }, { "$project":{ "v":1, "t":1, "_id":0 } } ])
这里把test字段的计算合并到$addFields里,去掉了重复的$match,最后用$project只保留需要的字段,既解决了错误,又提升了查询效率。
内容的提问来源于stack exchange,提问作者Kousha
相关产品推荐
相关产品推荐

