2011-11-21 17 views
6

Ho questo codicemangusta aggiornamento di un campo in un MongoDB non lavorano

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); 

Vorrei aggiornare il mio utente (trovando con il suo nome) per aggiornando i suoi punti. Sono sicuro che oldPoints e punti contengano un valore , ma il mio utente continua a rimanere a zero punti. La console stampa l'aggiornamento con esito positivo.

Cosa sto sbagliando? Ci scusiamo per la domanda stupida/noob.

Mäsiar

+0

possiamo vedere alcune più codice? Qualcosa che possa essere riprodotto come scritto sarebbe molto utile. – staackuser2

+0

scusa per quello, eccoti! :) – Masiar

risposta

10

Sembra che si sta facendo alcune cose unstandard:

  • Uso findOne invece di find se si desidera caricare un solo utente
  • Calling Model.update dovrebbe essere fatto per aggiornare i record che non hai caricato
  • $inc sta aggiungendo oldPoints, quindi il nuovo valore sarà 2 * oldPoints + newPoints
  • Si utilizza name come la query condizionale anziché Username

vorrei riscrivere il codice in qualcosa di simile a questo:

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

Grazie mille! Penso che il problema era che non stavo usando findOne! Il $ inc è stato fatto perché non sapevo se lo stavo aggiornando correttamente, quindi ho provato ogni possibile comando. Grazie ancora! – Masiar

+0

Grazie per aver risolto un problema di aggiornamento simile per me. Per il quale stavo lottando per gli ultimi 3 giorni. –

+1

È una cattiva pratica. È possibile sostituire il documento già esistente e modificato tra le chiamate '' 'findOne ... user.save'''. – ruX

0

seguire il mio codice ragazzo

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

Non sai con chi stai parlando ("ragazzo?" Davvero?). Ma hai postato una domanda, e hai risposto (con una risposta accettata), 5 anni fa. –

Problemi correlati