2013-01-07 12 views
30

Ho un modello di User Mongoose:Mongoose: trovare, modificare, salvare

var User = mongoose.model('Users', 
    mongoose.Schema({ 
     username: 'string', 
     password: 'string', 
     rights: 'string' 
    }) 
); 

voglio trovare un'istanza del modello User, modificare le sue 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 sintassi di trovare, modificare e salvare un'istanza del modello User?

+3

vorrei suggerire di provare il metodo di User.findOne() invece di User.find() – sethetter

risposta

39

Perché non utilizzare Model.update? Dopo tutto non si sta usando l'utente trovata per altro che per aggiornare le sue proprietà:

User.update({username: oldUsername}, { 
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights 
}, function(err, numberAffected, rawResponse) { 
    //handle it 
}) 
+8

Sì, ma essere premiato con questo "Model.update sta inviando il comando direttamente a MongoDB - i documenti non vengono restituiti - quindi non c'è nulla su cui eseguire la convalida" - Aaron Heckmann https://github.com/LearnBoost/mongoose/issues/ 635 – jackdbernier

+5

Si noti che Model.update non supera la convalida definita nello schema! Vedere il primo paragrafo su: http://mongoosejs.com/docs/validation.html –

80

Il parametro user della richiamata è un array con find. Utilizzare findOne anziché find quando si esegue 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!'); 
     } 
    }); 
}); 
+2

non lievitare un errore di "chiave di duplicazione"? – DeLac

+5

@DeLac No, il 'save' esegue un'operazione di aggiornamento in questo caso. – JohnnyHK

+0

@DeLac, potresti vedere l'errore della chiave di duplicazione dal salvataggio dell'utente '_id'. In questo caso, prova ad aggiornare le proprietà separatamente o rimuovi '_id' prima di' save'. – wag0325

3

Se si desidera utilizzare find, come avrei per qualsiasi convalida si vuole fare sul lato client.

find restituisce un array di oggetti

findOne restituisce solo un oggetto

Aggiunta user = user[0] ha reso il lavoro salvare metodo 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!'); 
     } 
    }); 
}); 
+12

Suggerire di non fare la convalida sul server è un consiglio orribile. – VtoCorleone

+0

@VtoCorle il problema dell'OP non è la convalida, è l'accesso. Una volta che si ha accesso all'oggetto, si è liberi di scrivere qualsiasi logica intorno ad essa sia la sua validazione o modifica. –

+0

questo è un duplicato della risposta @JohnnyHK e, inoltre, meno corretto. – extempl