使用节点js更新mongodb中的单个文档

时间:2018-02-01 22:39:18

标签: javascript node.js mongodb

我是node和mongodb的新手,我正在尝试使用node更新mongo数据库中的用户密码。我收到以下错误 -

errmsg: 'After applying the update to the document {_id: ObjectId(\'5a4f50381a1152ec09277578\') , ...}, the (immutable) field \'_id\' was found to have been altered to _id: ObjectId(\'5a739493c592356f1b5a78b6\')'}

models/accounts.js中的代码是

AccountSchema.static('passchange', function (password, callback) {
var that = this;
if (typeof userobj!="undefined") {
        console.log("User Object");
        console.log(userobj._id); //I am getting the user id here

        that.findOne({_id:userobj._id}, function (err, user) {
            if (!user) {
                console.log("No User");
                return callback(null, false);
            }
            else
            {
                var salt = this.salt = bcrypt.genSaltSync(10);
                var hash = bcrypt.hashSync(password, salt);

                var updatepwd = new that({
                    salt: salt,
                    hash: hash
                });
                var conditions = { _id: userobj._id }
                that.updateOne(conditions,updatepwd, function (err, savePassword) {
                    if (err)
                    {
                        console.log("err");
                        console.log(err);
                        return callback({err: err}, false);
                    } else {
                        console.log("savePassword._id");
                        console.log(savePassword._id);
                        //return callback(null, {_id : savePassword._id});
                    }
                });
            }
        });

    }
}); 

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:1)

为了记录解决方案:

根据评论中的讨论,问题似乎是原始文档被更新完全覆盖,而不是仅更新hashsalt字段。适当的解决方法是将updatepwd值更新为以下内容:

var updatepwd: { $set: {
    salt: salt,
    hash: hash
}};

$set运算符确保只更新salthash,因此_id字段(以及其余数据)保持不变。

答案 1 :(得分:0)

您可能需要更新新运算符,因为当您不打算更改ID而只是密码时,您正在生成新ID。尝试遵循以下逻辑而不是新操作符。

items.forEach(function (product) { //update or create new products

// Es6 assign
var productToUpdate = {};
productToUpdate = Object.assign(productToUpdate, product._doc);
delete productToUpdate._id;

Product.findOneAndUpdate({product_id: product.product_id}, productToUpdate, 
                     {upsert: true}, function (err) {
if (err)  return updateDBCallback(err);
   updateDBCallback(null, 'saved');
});
});