猫鼬document.save()抛出“验证失败”

时间:2019-11-22 17:27:48

标签: node.js mongodb mongoose

我正在尝试使用以下代码在我的收藏集中运行批处理更新:

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"

我在做什么错了?

2 个答案:

答案 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)
    })