MongoDB通过聚合管道弹出数组尾元素且为空时移除字段的实现
实现方案
可以通过聚合管道实现该需求,核心使用$slice运算符完成数组末尾元素的弹出操作,再配合空数组判定逻辑自动移除字段即可,完整实现代码如下:
db.collection.update( // 匹配条件可按需调整,此处增加array存在且非空的判断,避免无效操作 { "array": { $exists: true, $ne: [] } }, [{ $set: { array: { // 截取数组从下标0到倒数第二位,等效于弹出最后一个元素 $slice: ["$array", 0, { $subtract: [{ $size: "$array" }, 1] }] } } }, { $set: { array: { $cond: [ { $eq: ["$array", []] }, "$$REMOVE", "$array" ] } } }] )
逻辑说明
- 第一个
$set阶段:通过计算数组长度减1作为截取长度,从数组起始位置截取对应长度的元素,实现移除最后一位的效果,和你现有代码的结构完全兼容。如果你使用的MongoDB版本支持$slice传入负截取长度,还可以把该步逻辑简化为$slice: ["$array", 0, -1],不需要额外计算数组长度,效果完全一致。 - 第二个
$set阶段:沿用你现有代码的逻辑,判定处理后的数组如果是空数组,就通过系统变量$$REMOVE自动删除该数组字段。
内容的提问来源于stack exchange,提问作者Ratery
相关产品推荐
相关产品推荐

