2011-11-21 12 views
6

Mam ten kodmangusta Aktualizowanie pola w MongoDB nie pracujących

var UserSchema = new Schema({ 
    Username: {type: String, index: true}, 
    Password: String, 
    Email: String, 
    Points: {type: Number, default: 0} 
}); 

[...]

var User = db.model('User'); 
    /* 
    * Function to save the points in the user's account 
    */ 
    function savePoints(name, points){ 
     if(name != "unregistered user"){ 
     User.find({Username: name}, function(err, users){ 

      var oldPoints = users[0].Points; 
      var newPoints = oldPoints + points; 

      User.update({name: name}, { $inc: {Points: newPoints}}, function(err){ 
       if(err){ 
        console.log("some error happened when update"); 
       } 
       else{ 
        console.log("update successfull! with name = " + name); 
        User.find({Username: name}, function(err, users) { 
         console.log("updated : " + users[0].Points); 
        }); 
       } 
      }); 

     }); 
    } 
} 

savePoints("Masiar", 666); 

Chciałbym zaktualizować użytkownika (poprzez znalezienie go z jego nazwą) od aktualizując swoje punkty. Jestem pewien, że stare punkty i punkty zawierają wartość , ale nadal mój użytkownik nadal znajduje się w punkcie zerowym. Konsola wypisze "aktualizacja zakończona pomyślnie".

Co robię źle? Przepraszam za głupie pytanie/noob.

Mäsiar

+0

możemy zobaczyć niektóre więcej kodu? Coś, co można powielić na piśmie, byłoby najbardziej pomocne. – staackuser2

+0

Przykro mi z tego, oto jesteś! :) – Masiar

Odpowiedz

10

Wydaje robisz kilka unstandard rzeczy:

  • Zastosowanie findOne zamiast find jeśli chcesz załadować tylko jeden użytkownik
  • Wywołanie Model.update należy zrobić, aby aktualizować rekordy nie załadowałeś
  • $inc dodaje oldPoints, więc nowa wartość będzie 2 * oldPoints + newPoints
  • Używasz name jako kwerendy warunkowego zamiast Username

Chciałbym przepisać kod na coś takiego:

User.findOne({Username: name}, function(err, user){ 
    if (err) { return next(err); } 
    user.Points += points; 
    user.save(function(err) { 
    if (err) { return next(err); } 
    }); 
}); 
+0

Wielkie dzięki! Myślę, że problem polegał na tym, że nie korzystałem z findOne! Wartość $ inc została wykonana, ponieważ nie wiedziałem, czy aktualizuję ją poprawnie, dlatego próbowałem każdego możliwego polecenia. Dzięki jeszcze raz! – Masiar

+0

Dzięki temu rozwiązano dla mnie podobny problem z aktualizacją. Za co walczyłem przez ostatnie 3 dni. –

+1

To jest zła praktyka. Możesz zastąpić już istniejący i zmieniony dokument pomiędzy wywołaniami findOne ... user.save''. – ruX

0

Follow My kod facet

User.update({ username: "faibaa" }, 
    { $inc: { point: 200000 } }, function(err,data){ 
     return res.send(data); 
    }); 
+1

Nie jesteś pewien, z kim rozmawiasz ("facet?" Naprawdę?). Ale wysłałeś na zadane pytanie i odpowiedziałeś (z zaakceptowaną odpowiedzią) 5 lat temu. –

Powiązane problemy