我正在尝试使用以下代码在我的收藏集中运行批处理更新:
updateRecordsToDateType = (req, res) => {
MyModel
.find({ enabled: true })
.exec()
.then( results => {
results.forEach( result => {
result.rate= result.rate * 0.98;
result.lastUpdate = moment();
result.save()
});
res.status(204).end();
}).catch( error => {
console.error(error);
});
}
但是在传递“ result.save()”行之后,它引发了以下错误:
ValidationError {errors: Object, _message: "MyModelvalidation failed", message: "MyModelvalidation failed: _id: Cast to Objec…", name: "ValidationError", stack: "ValidationError: MyModelvalidation failed: _…"}
Cast to ObjectId failed for value "ObjectId("5bc4cf560bef473414cb22ec")" at path "_id"
我在做什么错了?
答案 0 :(得分:0)
在forEach
函数中,您的行将显示为result.save()
。失败的原因是因为result
不是模型,所以您无法将其保存到数据库。您需要做的是为单个结果创建一个新模型,将值保存到该模型的元素之一,然后将其保存到数据库,例如:
let resultModel = new Model();
result.rate= result.rate * 0.98;
result.lastUpdate = moment();
result.save()
答案 1 :(得分:0)
您更新文档的方式是将整个MyModel
集合加载到内存中。在内存中编辑result
之前,需要在其上调用.toJSON()。这非常昂贵。您可以使用updateMany并使用$mul(乘法)运算符来告诉数据库完成所有工作。
MyModel.updateMany(
{ enabled: true },
{
lastUpdate: moment(),
$mul: { "result.rate": 0.98 }
}).then(result => {
//
}).catch(err => {
console.error(err)
})