2011-11-21 31 views
6

我有這樣的代碼貓鼬在MongoDB中更新字段不工作

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

我想更新我的用戶(通過與它的名字找到它)通過 更新他/她的點數。我確信oldPoints和積分包含 的值,但仍然是我的用戶保持在零點。控制檯打印 「更新成功」。

我在做什麼錯?對不起,愚蠢/ noob問題。

Masiar

+0

我們可以看到一些更多的代碼?可以以書面形式複製的東西將是最有幫助的。 – staackuser2

+0

對不起,在這裏! :) – Masiar

回答

10

看來你正在做一些不規範的東西:

  • 使用findOne,而不是如果你想find加載只是一個用戶
  • 調用Model.update應該做的更新記錄是您尚未加載
  • $inc正在添加oldPoints,因此新值將爲2 * oldPoints + newPoints
  • 您正在使用name作爲條件查詢,而不是Username

我將重寫代碼弄成這個樣子:

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

非常感謝!我認爲問題在於我沒有使用findOne! $ inc的完成是因爲我不知道我是否正確更新它,因此我嘗試了所有可能的命令。再次感謝! – Masiar

+0

感謝它爲我解決了類似的更新問題。爲此我最近3天掙扎着。 –

+1

這是不好的做法。您可以在''''findOne ... user.save'''調用之間替換已經存在和已更改的文檔。 – ruX

0

跟隨我的代碼傢伙

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

不確定你在和誰說話(「傢伙?」真的嗎?)。但是你發佈了一個問題,並在5年前回答了(接受了答案)。 –