Mongoose: trova, modifica, salva

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.