Ho un modello User
Mongoose:
var User = mongoose.model('Users', mongoose.Schema({ username: 'string', password: 'string', rights: 'string' }) );
Voglio trovare un’istanza del modello User
, modificarne le proprietà e salvare le modifiche. Questo è quello che ho provato (è sbagliato!):
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!'); } }); });
Qual è la syntax per trovare, modificare e salvare un’istanza del modello User
?
Perché non utilizzare Model.update ? Dopo tutto non stai usando l’utente trovato per nient’altro che aggiornare le sue proprietà:
User.update({username: oldUsername}, { username: newUser.username, password: newUser.password, rights: newUser.rights }, function(err, numberAffected, rawResponse) { //handle it })
Il parametro user
del callback è un array con find
. Utilizzare findOne
invece di find
quando si findOne
una query per una singola istanza.
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!'); } }); });
Se vuoi usare find
, come farei per qualsiasi convalida che vuoi fare dal lato client.
find
restituisce un ARRAY di oggetti
findOne
restituisce solo un object
L’aggiunta di user = user[0]
reso il metodo di salvataggio funzionante per me.
Ecco dove lo metti.
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!'); } }); });
Volevo aggiungere qualcosa di molto importante. Uso molto il metodo JohnnyHK ma ho notato che a volte le modifiche non persistevano nel database. Quando ho usato. .markModified
ha funzionato.
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!'); } }); });
dillo a mangusta sulla modifica con doc.markModified (‘pathToYourDate’) prima di salvare.