猫鼬:查找,修改,保存

时间:2013-01-07 16:01:59

标签: javascript node.js mongoose

我有一个Mongoose User模型:

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

我想找到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!');
        }
    });
});

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

6 个答案:

答案 0 :(得分:99)

回调的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!');
        }
    });
});

答案 1 :(得分:48)

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

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

答案 2 :(得分:3)

如果您想使用find,就像我想要在客户端进行任何验证一样。

find返回对象的ARRAY

findOne只返回一个对象

添加user = user[0]使保存方法对我有效。

这是你放的地方。

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

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});

答案 3 :(得分:3)

我想添加一些非常重要的内容。我经常使用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!');
    }
});
});
  

在保存之前用doc.markModified('pathToYourDate')告诉猫鼬更改。

答案 4 :(得分:1)

您还可以使用updateOne和$ set以及async / await将其编写得更加简洁。

const updateUser = async (newUser) => {
  try {
    await User.updateOne({ username: oldUsername }, {
      $set: {
        username: newUser.username,
        password: newUser.password,
        rights: newUser.rights
      }
    })
  } catch (err) {
    console.log(err)
  }
}

由于不需要生成的文档,因此可以只使用updateOne而不是findOneAndUpdate。

以下是关于区别的很好的讨论:MongoDB 3.2 - Use cases for updateOne over findOneAndUpdate

答案 5 :(得分:0)

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));
});

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);
});

另请参见updateOne