如何在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
相关产品推荐
相关产品推荐

