如何在MongoDB中通过另一字段值增加指定字段值(Mongoose)
问题解决:Mongoose中用字段值更新另一字段的类型错误
问题说明
尝试用Mongoose通过Workers.Efficiency.Mine字段的值来增加Resources.Gold字段的值时,出现类型转换错误。系统能识别Resources.Gold为数字类型,但将Workers.Efficiency.Mine识别为字符串类型,导致更新失败。
给定Schema(注意:原Schema中Nuber为拼写错误,应为Number)
Resources: { Gold: Number } Workers: { Efficiency: { Mine: Number } }
原错误代码
schema.updateMany({}, { $inc: { "Resources.Gold": "Workers.Efficiency.Mine" } }, function(err, response) { if(err) console.log(err); else console.log(response); });
解决方案
MongoDB 4.2及以上版本支持在更新操作中使用聚合管道,以此引用文档自身的字段值。修改后的代码如下:
schema.updateMany({}, [ { $set: { "Resources.Gold": { $add: ["$Resources.Gold", "$Workers.Efficiency.Mine"] } } } ], function(err, response) { if(err) console.log(err); else console.log(response); });
关键说明
- 原代码中
$inc的参数直接传入字符串字段路径是错误的,$inc仅接受数值类型,无法直接引用其他字段。 - 使用聚合管道数组作为更新操作的第二个参数,通过
$add操作符将Resources.Gold和Workers.Efficiency.Mine的值相加,再用$set更新Resources.Gold字段。 - 确保你的MongoDB版本在4.2及以上,否则不支持该特性。
内容的提问来源于stack exchange,提问作者Amit Hadad
相关产品推荐
相关产品推荐

