MongoDB聚合按入参数组过滤字段 排除空匹配结果方法
MongoDB聚合查询修正方案
现有语句问题点
- 参数嵌套错误:你将传入的
charger数组额外包裹了一层方括号,导致匹配时使用的是二维数组,$in判断逻辑不符合预期 - 缺少空文档过滤:数组过滤完成后没有剔除
chance为空的无效文档 - 缺少结构重塑步骤:没有将匹配到的数组项拆分为平铺结构,和期望输出格式不匹配
- 入参存在笔误:Postman传入的参数中
"symbol,"多了尾部逗号,会导致字符串匹配失败
修正后完整聚合代码
db.collection.aggregate([ { // 第一步:过滤chance数组中匹配inked值的项 $project: { chance: { $filter: { input: "$chance", as: "c", cond: { $in: ["$$c.inked", charger] // 直接引用传入的charger数组,无需额外套数组 } } } } }, { // 第二步:剔除过滤后chance数组为空的文档 $match: { "chance.0": { $exists: true } } }, { // 第三步:拆分chance数组,将每个匹配项转为独立文档 $unwind: "$chance" }, { // 第四步:输出期望的字段结构 $project: { _id: 0, id: "$_id", inked: "$chance.inked", aim: "$chance.aim" } } ])
补充说明
- 先修正Postman入参的笔误,将
"symbol,"改为"symbol",保证字符串完全匹配 - 空数组过滤阶段也可以用
$expr: { $gt: [ { $size: "$chance" }, 0 ] }替换"chance.0": { $exists: true },效果完全一致
内容的提问来源于stack exchange,提问作者bihari atal
相关产品推荐
相关产品推荐

