2013-01-07 12 views
30

Mam Mongoose User model:Mongoose: Znajdź, modyfikować, zapisywać

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

Chcę znaleźć jedną instancję modelu User, modyfikować jego właściwości i zapisać zmiany. To, co starałem (to źle!):

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!'); 
     } 
    }); 
}); 

Jaka jest składnia do znalezienia, modyfikować i zapisywać instancję modelu User?

+3

Proponuję spróbować User.findOne() metoda zamiast User.find() – sethetter

Odpowiedz

39

Dlaczego nie używać Model.update? Po tym wszystkim nie używasz znaleziony użytkownika o cokolwiek innego niż to, żeby go zaktualizować właściwości:

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

Tak, ale otrzymasz nagrodę za ten "Model.update wysyła polecenie bezpośrednio do MongoDB - dokumenty nie są zwracane - więc nic nie można uruchomić sprawdzania" - Aaron Heckmann https://github.com/LearnBoost/mongoose/issues/ 635 – jackdbernier

+5

Należy pamiętać, że Model.update nie przechodzi walidacji zdefiniowanej w schemacie! Zobacz pierwszy akapit na temat: http://mongoosejs.com/docs/validation.html –

80

Parametr wywołania zwrotnego w postaci user to tablica z find. Użyj findOne zamiast find podczas sprawdzania pojedynczej instancji.

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

nie wzrosnąć do „powielanie klucz” błąd? – DeLac

+5

@DeLac Nie, operacja 'zapisz' w tym przypadku wykonuje operację aktualizacji. – JohnnyHK

+0

@DeLac, możesz zobaczyć błąd klucza duplikacji od zapisania użytkownika '_id'. W takim przypadku spróbuj zaktualizować właściwości osobno lub usuń '_id' najpierw przed' save'. – wag0325

3

Jeśli chcesz użyć find, jak ja za każdym walidacji chcesz zrobić po stronie klienta.

find zwraca tablicę obiektów

findOne zwraca tylko obiekt

Dodajesz user = user[0] był jednak dobrze ustawiony metody pracy dla mnie.

Oto, gdzie to umieścisz.

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

Sugerowanie, aby nie sprawdzać poprawności na serwerze, jest okropną radą. – VtoCorleone

+0

@VtoCorleone Problem PO nie jest walidacją, jest dostęp. Jeśli masz dostęp do obiektu, możesz napisać dowolną logikę wokół niego, czy to sprawdzanie czy modyfikacja. –

+0

jest to duplikat odpowiedzi @JohnnyHK, a ponadto mniej poprawny. – extempl