更新查找中的文档

Updating document within find

本文关键字:文档 查找 更新      更新时间:2023-09-26

我在使用Mongoose从查找中更新文档时遇到问题。只有当我试图用对象(例如doc = req.body)覆盖文档时,问题才会出现。然而,我能够直接将原始文档的属性设置为特定的字符串(例如doc.name = 'jason borne';)。

我已经验证了res.body是一个对象,所以我不明白为什么我不能这样设置它。

Client.findById(req.params.client_id, function (err, client) {
    if (err)
        return next(new restify.InternalError(err));
    // client.name = 'jason borne';
            client = req.body;
    client.save(function(err) {
        if (err)
            return next(new restify.InternalError(err));
        res.send(client);
    });
});

当尝试将文档设置为对象时,我收到错误:

TypeError: object#没有save方法

我知道我可以用一个简单的Client.update(…)命令进行更新,但是这个方法不允许我的模式中间件或验证运行(这在Mongoose文档中有说明)。

任何想法吗?我是Node和Mongoose的新手

您需要使用类似下划线的extend方法将req.body的属性复制到client对象中,而不是像现在这样将client重新指向req.body

var _ = require('underscore');
Client.findById(req.params.client_id, function (err, client) {
    if (err)
        return next(new restify.InternalError(err));
    _.extend(client, req.body);
    client.save(function(err) {
        if (err)
            return next(new restify.InternalError(err));
        res.send(client);
    });
});

您现在得到的症状是由于您正在用从您的身体解析的简单json对象替换mogoose模型对象(使用save, find等方法),而该对象缺少save

尝试更新而不是查找/保存。

 Client.update({_id: req.params.client_id}, {$set : req.body}, function(err) {...});

或者尝试将req.body合并到client对象。