2011-11-21 3 views
6

j'ai ce codemangouste mise à jour d'un champ dans un MongoDB ne fonctionne pas

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

Je voudrais mettre à jour mon utilisateur (en trouvant avec son nom) par mettant à jour ses points. Je suis sûr que les anciens points et points contiennent une valeur , mais mon utilisateur reste toujours à zéro point. La console imprime "mise à jour réussie".

Qu'est-ce que je fais mal? Désolé pour la question stupide/noob.

Masiar

+0

pouvons-nous voir plus de code? Quelque chose qui peut être reproduit comme écrit serait le plus utile. – staackuser2

+0

désolé pour cela, vous y êtes! :) – Masiar

Répondre

10

Il semble que vous faites quelques choses UNstandard:

  • Utilisation findOne au lieu de find si vous voulez charger un seul utilisateur
  • Appel Model.update doit être fait pour mettre à jour les enregistrements vous n'avez pas chargé
  • $inc est l'ajout de oldPoints, donc la nouvelle valeur sera 2 * oldPoints + newPoints
  • Vous utilisez name que la requête conditionnelle au lieu de Username

Je réécrire le code en quelque chose comme ceci:

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

Merci beaucoup! Je pense que le problème était que je n'utilisais pas findOne! Le $ inc a été fait parce que je ne savais pas si je le mettais à jour correctement, donc j'ai essayé toutes les commandes possibles. Merci encore! – Masiar

+0

Merci, il a résolu un problème de mise à jour similaire pour moi. Pour lequel je me débattais depuis 3 jours. –

+1

C'est une mauvaise pratique. Vous pouvez remplacer le document déjà existant et modifié entre les appels '' 'findOne ... user.save'''. – ruX

0

suivre mon mec code

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

Vous ne savez pas à qui vous parlez ("gars?" Vraiment?). Mais vous avez répondu à une question posée et répondu (avec la réponse acceptée), il y a 5 ans. –

Questions connexes