MongoDB聚合$cond判断数组元素失效问题排查与解决
问题分析与修复方案
我来帮你排查这个问题——你的$cond始终返回Bad的核心原因是**$in的用法不符合MongoDB的语法要求**,咱们拆解来看:
错误原因
MongoDB的$in操作符语法是:{ $in: [ <单个值>, <数组> ] },它的作用是检查「单个值」是否存在于指定数组中。
但你当前的写法里,把第一个参数写成了$Brand.models.name——这是从models数组中提取的所有name字段组成的数组(比如第一个文档里这个值是["AA", "BB"]),而不是单个值。$in没法判断一个数组是否包含在另一个数组里,所以你的if条件永远不成立,自然一直走else分支返回Bad。
修复方法
要判断Brand.models.name数组中是否存在任意元素属于['BB','TC','TS']这个目标列表,需要结合$anyElementTrue和$map来实现:
- 用
$map遍历Brand.models数组,对每个元素的name字段做$in判断(此时$in的第一个参数是单个name值,符合语法) - 用
$anyElementTrue检查$map返回的布尔值数组中是否有至少一个true,以此作为$cond的判断条件
修改后的聚合查询如下:
db.runCommand({ aggregate: 'cars', 'pipeline': [ { '$project': { 'desc': { '$cond': { if: { $anyElementTrue: { $map: { input: "$Brand.models", as: "model", in: { $in: ["$$model.name", ['BB','TC','TS']] } } } }, then: 'Good', else: 'Bad' } } } }, { '$project': { 'desc': 1 } }, { $out: 'cars_stg' } ], 'allowDiskUse': true, })
验证效果
- 第一个文档
Brand.models包含"BB",$map会返回[false, true],$anyElementTrue结果为true,所以desc是Good - 第二个文档
Brand.models的name是"AG"和"AA",都不在目标列表里,$map返回[false, false],$anyElementTrue结果为false,所以desc是Bad
完全符合你的预期逻辑。
内容的提问来源于stack exchange,提问作者jmarco10
相关产品推荐
相关产品推荐

