You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB聚合的$group阶段通过$push返回空数组?

如何在MongoDB聚合的$group阶段通过$push返回空数组?

嘿,我之前刚好碰到过类似的需求,给你两个实用的解决方案,看哪个更贴合你的场景:

方案一:直接用$literal返回空数组

如果你不管当前分组下有多少条文档,都想让occupied字段直接是空数组,那完全不用纠结$push,用$literal操作符就能一步到位。它可以直接返回你指定的字面量值,代码示例如下:

$group: {
  _id: { _id: '$_id', name: '$name'},
  occupied: { $literal: [] }
}

这样不管你的分组里有没有匹配的文档,occupied都会是[],完美解决你遇到的问题。

方案二:条件性生成空数组(按需使用)

如果你的需求是只有当分组里没有满足特定条件的元素时,才返回空数组,那可以结合$cond和$push,配合$$REMOVE来实现。比如假设你只想push存在某个字段的元素,没有符合条件的就返回空数组:

$group: {
  _id: { _id: '$_id', name: '$name'},
  occupied: {
    $push: {
      $cond: [
        { $exists: ['$targetField', true] }, // 这里写你的判断条件
        '$targetField',
        '$$REMOVE' // 不满足条件就移除该元素,不会被push进数组
      ]
    }
  }
}

这样如果分组里所有文档都不满足条件,$push最终就会生成空数组[],而不是包含null的数组。

另外补充一句:你之前用$push: null或$push: undefined得到[null]是正常行为,因为$push会把你传入的每个值都添加到数组里,哪怕是null/undefined,所以自然会生成包含该值的数组。而用$literal相当于直接给字段赋值空数组,跳过了push的逻辑,这才是你想要的效果~

备注:内容来源于stack exchange,提问作者Gervasius Twinklewinkleson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:34:49