猫鼬:查找,修改,保存

Ran*_*lue 40 javascript mongoose node.js

我有一个Mongoose User模型:

var User = mongoose.model('Users',
    mongoose.Schema({
        username: 'string',
        password: 'string',
        rights: 'string'
    })
);
Run Code Online (Sandbox Code Playgroud)

我想找到一个User模型实例,修改它的属性,并保存更改.这是我试过的(这是错的!):

User.find({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

查找,修改和保存User模型实例的语法是什么?

Joh*_*yHK 107

user回调的参数是一个数组find.在查询单个实例时使用findOne而不是find代理.

User.findOne({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • @DeLac不,在这种情况下,`save`执行更新操作. (5认同)
  • 它不会引起"重复密钥"错误吗? (2认同)

sou*_*eck 50

为什么不使用Model.update?毕竟,除了更新它的属性之外,你没有使用找到的用户:

User.update({username: oldUsername}, {
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
   //handle it
})
Run Code Online (Sandbox Code Playgroud)

  • 是的,但被授予此"Model.update将命令直接发送到MongoDB - 文件不会返回 - 所以没有什么可以运行验证" - Aaron Heckmann https://github.com/LearnBoost/mongoose/issues/635 (9认同)
  • 请注意,Model.update不会传递Schema中定义的验证!请参阅第一段:http://mongoosejs.com/docs/validation.html (6认同)

Ant*_*ley 7

findOne,修改字段并保存

User.findOne({username: oldUsername})
  .then(user => {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.markModified('username');
    user.markModified('password');
    user.markModified('rights');

    user.save(err => console.log(err));
});
Run Code Online (Sandbox Code Playgroud)

findOneAndUpdate

User.findOneAndUpdate({username: oldUsername}, {$set: { username: newUser.username, user: newUser.password, user:newUser.rights;}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }
    console.log(doc);
});
Run Code Online (Sandbox Code Playgroud)

另见updateOne


jac*_*ank 5

我想添加一些非常重要的内容。我经常使用 JohnnyHK 方法,但我注意到有时更改不会持久保存到数据库中。我用的时候.markModified就成功了。

User.findOne({username: oldUsername}, function (err, user) {
   user.username = newUser.username;
   user.password = newUser.password;
   user.rights = newUser.rights;

   user.markModified(username)
   user.markModified(password)
   user.markModified(rights)
    user.save(function (err) {
    if(err) {
        console.error('ERROR!');
    }
});
});
Run Code Online (Sandbox Code Playgroud)

在保存之前用 doc.markModified('pathToYourDate') 告诉 mongoose 有关更改的信息。