MongoDB中updateMany:tags为null时$set,非null时$push的实现
解决方案
针对你的需求,可以使用MongoDB的聚合管道模式来实现updateMany的条件分支更新,具体语句如下:
假设你要添加的新标签为{k:"new",v:"1"},执行以下命令:
db.collection.updateMany( {}, // 若需匹配特定文档,可在此添加查询条件,留空则匹配所有 [ { $set: { tags: { $cond: { if: { $eq: ["$tags", null] }, then: [{ k: "new", v: "1" }], // tags为null时,直接设置为包含新标签的数组 else: { $concatArrays: ["$tags", [{ k: "new", v: "1" }]] } // tags为数组时,合并原数组与新标签 } } } } ] )
关键说明:
- 必须使用聚合管道模式(即
updateMany的第二个参数是数组),普通更新模式不支持聚合运算符的条件判断,这也是你之前用$ifNull无效的原因——$ifNull是聚合运算符,只能在聚合管道中使用。 $cond用于实现分支逻辑:判断tags是否为null,分别执行不同的赋值逻辑。- 对于已有数组的情况,用
$concatArrays合并原数组和新标签组成的单元素数组,效果等同于$push;如果需要添加多个标签,只需把单元素数组换成对应多元素数组即可。
执行后,你的文档会被更新为:
{ name: "sunil", tags: [{k:"new",v:"1"}] } { name: "radha", tags: [{k:"max",v:"4"},{k:"min",v:"3"},{k:"new",v:"1"}] }
内容的提问来源于stack exchange,提问作者Yashdeep Hinge
相关产品推荐
相关产品推荐

