MongoDB能否基于数组长度设置字段?现有代码失效求解决方案
MongoDB中基于数组长度更新对应字段的正确实现方式
你的需求完全可以在MongoDB中实现,先明确你代码的问题:直接在$set里使用$size聚合操作符是无效的——普通更新模式下,$set只能赋值固定值,不能引用当前字段值进行计算。
正确实现方式(MongoDB 4.2+ 推荐)
从MongoDB 4.2版本开始,支持使用更新管道(将更新操作写成数组形式),管道模式下可以在更新阶段使用聚合表达式,完美解决你的需求:
db.user.updateOne( { user_name: "jon_doe" }, [ // 第一步:往followers数组添加新元素(自动去重) { $addToSet: { followers: "userthreeID" } }, // 第二步:计算更新后的数组长度,赋值给followers_count { $set: { followers_count: { $size: "$followers" } } } ] )
执行后就能得到预期结果:
{ user_name:"jon_doe", followers: ["useroneID", "usertwoID","userthreeID"], followers_count: 3 }
旧版本MongoDB(低于4.2)的替代方案
如果你的MongoDB版本低于4.2,只能分两步操作(效率略低,但能实现需求):
- 先添加元素到数组:
db.user.updateOne( { user_name: "jon_doe" }, { $addToSet: { followers: "userthreeID" } } )
- 再单独更新计数:
db.user.updateOne( { user_name: "jon_doe" }, [ { $set: { followers_count: { $size: "$followers" } } } ] )
内容的提问来源于stack exchange,提问作者devGrammer
相关产品推荐
相关产品推荐

