2011-11-21 18 views
6

que tienen el códigomangosta actualización de un campo de una MongoDB no trabajan

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

me gustaría actualizar mi usuario (mediante la búsqueda con su nombre) por actualizando sus puntos. Estoy seguro de que los puntos antiguos y los puntos contienen un valor de , pero aun así mi usuario sigue estando en cero puntos. La consola imprime "actualización exitosa".

¿Qué estoy haciendo mal? Perdón por la pregunta estúpida/novato.

Masiar

+0

podemos ver algunos mas codigo? Algo que puede reproducirse como está escrito sería de gran ayuda. – staackuser2

+0

disculpa por eso, ¡aquí estás! :) – Masiar

Respuesta

10

Parece que está haciendo algunas cosas unstandard:

  • Uso findOne en lugar de find si desea cargar un único usuario
  • Calling Model.update se debe hacer para actualizar los registros que no ha cargado
  • $inc está agregando oldPoints, por lo que el nuevo valor será 2 * oldPoints + newPoints
  • está usando el name como la consulta condicional en lugar de Username

Me gustaría volver a escribir el código en algo como esto:

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

¡Muchas gracias! ¡Creo que el problema era que no estaba usando FindOne! El $ inc se realizó porque no sabía si estaba actualizando correctamente, así que probé todos los comandos posibles. ¡Gracias de nuevo! – Masiar

+0

Gracias, ha resuelto un problema de actualización similar para mí. Por lo que estuve luchando durante los últimos 3 días. –

+1

Es una mala práctica. Puede reemplazar documentos ya existentes y modificados entre llamadas '' 'findOne ... user.save'''. – ruX

0

seguir mi código chico

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

No estoy seguro de con quién estás hablando ("¿chico?" ¿En serio?). Pero publicó una pregunta y respondió (con una respuesta aceptada), hace 5 años. –

Cuestiones relacionadas