在find中更新文档

时间:2013-01-15 20:38:33

标签: javascript node.js mongoose

我在使用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);

    });

});

尝试将doc设置为对象时,收到错误:

TypeError:Object#没有方法'save'

我知道我可以使用简单的Client.update(...)命令进行更新,但是此方法不允许我的架构中间件或验证运行(在Mongoose documentation中有注释) )。

有什么想法?我是Node和Mongoose的新手。

2 个答案:

答案 0 :(得分:2)

你现在得到的症状是由于你正在用你的身体解析的一个简单的json对象替换一个mogoose模型对象(使用save,find等方法),这个对象遗漏了{{ 1}}。

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

save

或者尝试将 Client.update({_id: req.params.client_id}, {$set : req.body}, function(err) {...}); 合并到req.body对象。

答案 1 :(得分:2)

您需要使用下划线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);
    });
});