MongoDB聚合$project阶段用$nin报错$in正常是什么原因?
问题原因解释
- 核心原因是混淆了MongoDB两类操作符的适用范围:
$nin属于查询操作符,仅能在find()的查询条件、聚合的$match阶段等接收查询过滤规则的场景使用,不属于聚合表达式操作符,无法直接在$filter的cond字段、算术运算等聚合表达式场景中调用,因此会触发未识别表达式的报错。$in同时支持查询场景和聚合表达式场景,所以替换后可以正常运行。
正确实现方案
如果要在聚合表达式中实现not in的筛选逻辑,只需要用$not操作符包裹$in的判断结果即可,修改后的代码如下:
$project: { "TransactionMonth": 1, "allFields": { "$filter": { "input": "$allFields", "as": "allFields", "cond": { "$not": { "$in": [ "$$allFields.CustomerType", ["A", "B", "C"] ] } } } } }
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

