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
?
Ответы
Ответ 1
Почему бы не использовать Model.update? В конце концов вы не используете найденного пользователя для чего-либо еще, кроме как обновить его свойства:
User.update({username: oldUsername}, {
username: newUser.username,
password: newUser.password,
rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
//handle it
})
Ответ 2
Параметр 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!');
}
});
});
Ответ 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!');
}
});
});
Ответ 4
Я хотел добавить что-то очень важное. Я часто использую метод 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!');
}
});
});
Перед сохранением сообщите mongoose об изменении с помощью doc.markModified('pathToYourDate').
Ответ 5
найти, изменить поля и сохранить
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
Ответ 6
Вы также можете написать это немного чище, используя 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 - Варианты использования для updateOne over findOneAndUpdate