J'ai un modèle Mongoose User
:
var User = mongoose.model('Users',
mongoose.Schema({
username: 'string',
password: 'string',
rights: 'string'
})
);
Je veux trouver une instance du modèle User
, modifier ses propriétés et enregistrer les modifications. C'est ce que j'ai essayé (c'est faux!):
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!');
}
});
});
Quelle est la syntaxe pour rechercher, modifier et enregistrer une instance du modèle User
?
Pourquoi ne pas utiliser Model.update ? Après tout, vous n'utilisez pas l'utilisateur trouvé pour autre chose que de mettre à jour ses propriétés:
User.update({username: oldUsername}, {
username: newUser.username,
password: newUser.password,
rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
//handle it
})
Le paramètre user
de votre rappel est un tableau avec find
. Utilisez findOne
au lieu de find
lorsque vous interrogez une seule instance.
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!');
}
});
});
Je voulais ajouter quelque chose de très important. J'utilise beaucoup la méthode JohnnyHK mais j'ai remarqué que parfois les modifications ne persistaient pas dans la base de données. Quand j'ai utilisé .markModified
cela a fonctionné.
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!');
}
});
});
informez mongoose du changement avec doc.markModified ('pathToYourDate') avant de sauvegarder.
Si vous souhaitez utiliser find
, comme pour toute validation que vous souhaitez effectuer côté client.
find
retourne un tableau d'objets
findOne
ne renvoie qu'un objet
Ajouter user = user[0]
a fait que la méthode de sauvegarde fonctionne pour moi.
Voici où vous le mettez.
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!');
}
});
});
findOne , modifiez les champs et enregistrez
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);
});
Voir aussi pdateOne
Vous pouvez aussi écrire un peu plus propre en utilisant updateOne & $ set, plus async/wait.
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)
}
}
Comme vous n'avez pas besoin du document résultant, vous pouvez simplement utiliser updateOne au lieu de findOneAndUpdate.
Voici une bonne discussion sur la différence: MongoDB 3.2 - Cas d’utilisation pour updateOne par findOneAndUpdate