2013-01-07 18 views
30

Bir Gelincik User modele sahip kaydetmek, değiştirmek, bul:Gelincik:

Ben, User modelinin bir örneğini bulmak o özelliklerini var değiştirebilir ve değişiklikleri kaydetmek istiyor
var User = mongoose.model('Users', 
    mongoose.Schema({ 
     username: 'string', 
     password: 'string', 
     rights: 'string' 
    }) 
); 

. Bu (! Bunun yanlış) denedim budur: User modelinin bir örneğini bulmak değiştirmek ve kaydetmek için sözdizimi nedir

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

?

+3

Ben User.findOne çalışırken yerine User.find ait() yöntemini öneririm() – sethetter

cevap

39

Neden Model.update? Eğer find kullanmak istiyorsanız herhangi doğrulama için istemci tarafında yapmak isteyeyim gibi

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

Evet, ancak buna hak kazanın "Model.update komutu doğrudan MongoDB'ye gönderiyor - belgeler iade edilmiyor - bu yüzden doğrulama işlemini yürütecek hiçbir şey yok" - Aaron Heckmann https://github.com/LearnBoost/mongoose/issues/ 635 – jackdbernier

+5

Model.update'in şemada tanımlanan doğrulamayı geçmediğini lütfen unutmayın! İlk paragrafa bakınız: http://mongoosejs.com/docs/validation.html –

80

senin geri arama user parametre find ile bir dizidir. Tek bir örnek için sorgularken find yerine findOne kullanın.

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

bir "çoğaltma anahtarı" hatası artmıyor? – DeLac

+5

@DeLac Hayır, 'kaydet 'bu durumda bir güncelleme işlemi gerçekleştirir. – JohnnyHK

+0

@DeLac, kullanıcı '_id' kaydetmeden çoğaltma anahtarı hatası görebilirsiniz. Bu durumda, özellikleri ayrı ayrı güncellemeye çalışın veya 'save'den önce' _id 'öğesini kaldırın. – wag0325

3

: Sonuçta bunu güncellemek için daha başka bir şey için bulunan kullanıcıyı kullanmadığınız özellikleri var.

finduser = user[0] benim için tasarruf yöntemi işi yapılmış ekleme nesneler

findOne döner sadece bir nesne

dizisi döndürür.

İşte nereye koyacağınız.

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

Sunucuda doğrulama yapılmaması önerisi, korkunç bir öneridir. – VtoCorleone

+0

@ VtoCorleone OP'nin problemi doğrulama değil, access.Once nesneye erişiminiz olduğunda, doğrulama veya modifikasyon etrafında herhangi bir mantık yazabilirsiniz. –

+0

Bu, @JohnnyHK cevabının bir kopyasıdır ve ayrıca daha az doğrudur. – extempl

İlgili konular