我有一个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
模型实例的语法是什么?
答案 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));
});
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