【问题标题】:Mongoose update document Fail with findByIdAndUpdateMongoose 更新文档因 findByIdAndUpdate 失败
【发布时间】:2013-08-14 00:25:41
【问题描述】:

尝试使用 findByIdAndUpdate 更新 MongoDB 文档:

var landmarkModel = mongoose.model('landmark', landmarkSchema, 'landmarks');  
var lm = new landmarkModel();

//adding data to schema here, like: lm.name = req.body.name;

lm.findByIdAndUpdate(req.body._id, lm, function (err, landmark) {
    if (err)
       console.log(err);
    else{
       console.log(null, landmark);
    }
});

返回错误:Object lm has no method 'findByIdAndUpdate'

我尝试用landmarkModel.findByIdAndUpdate 替换lm.findByIdAndUpdate 值,但这也不起作用。我做错了什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    findByIdAndUpdate 是一个静态方法:

    var landmarkModel = mongoose.model('landmark', landmarkSchema, 'landmarks');
    var lm = req.body;
    
    delete lm._id;
    
    landmarkModel.findByIdAndUpdate(req.body._id, lm, console.log);
    

    请注意,landmarkModel 接受普通的 js 对象。

    如果您已经有一个 mongoose 对象,那么最好使用 save 代替:

    var landmarkModel = mongoose.model('landmark', landmarkSchema, 'landmarks');
    
    landmarkModel.findById(req.body._id, function (err, lm) {
      if (err) return next(err);
    
      //adding data to schema here, like: lm.name = req.body.name;
    
      lm.save(console.log);
    });
    

    【讨论】:

    • 在实现您的代码后出现此错误:[错误:$__ 的原子更新值无效。期望一个对象,收到对象]
    • 很可能,您将Mongoose 对象作为findByIdAndUpdate 的更新传递。在我的示例中,lm 应该是普通的 js 对象。
    • 我使用lm.toObject();lm 转换为一个对象(我正在对req.body 进行额外的服务器端修改),现在console.log 回调findbyIdAndUpdate 返回@987654335 @ 并且文档没有更新
    • 我建议你切换到findById = save。它专为您的情况而设计。
    猜你喜欢
    • 2021-10-23
    • 2018-08-18
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多