2011-11-21 23 views
6

tôi có mã nàymongoose cập nhật một trường trong một MongoDB không làm việc

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

Tôi muốn cập nhật người dùng của tôi (bằng cách tìm nó với tên gọi của nó) bằng cách cập nhật điểm của mình. Tôi chắc chắn oldPoints và các điểm chứa giá trị , nhưng người dùng của tôi vẫn giữ nguyên ở mức 0 điểm. Bảng điều khiển in "cập nhật thành công".

Tôi đang làm gì sai? Xin lỗi vì câu hỏi ngu ngốc/noob.

Masiar

+0

chúng ta có thể thấy một số thêm mã? Cái gì đó có thể được sao chép dưới dạng văn bản sẽ hữu ích nhất. – staackuser2

+0

xin lỗi vì điều đó, thông tin cho bạn đây! :) – Masiar

Trả lời

10

Có vẻ như bạn đang làm một vài điều unstandard:

  • Sử dụng findOne thay vì find nếu bạn muốn tải chỉ một người dùng
  • Calling Model.update nên được thực hiện để cập nhật hồ sơ mà bạn chưa tải
  • $inc là thêm oldPoints, vì vậy giá trị mới sẽ là 2 * oldPoints + newPoints
  • Bạn đang sử dụng name như truy vấn có điều kiện thay vì Username

tôi sẽ viết lại mã vào một cái gì đó như thế này:

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

Cảm ơn rất nhiều! Tôi nghĩ vấn đề là tôi không sử dụng findOne! The $ inc đã được thực hiện bởi vì tôi không biết nếu tôi đã được cập nhật nó đúng, do đó tôi đã thử mọi lệnh có thể. Cảm ơn một lần nữa! – Masiar

+0

Cảm ơn nó đã giải quyết được vấn đề cập nhật tương tự cho tôi. Tôi đã vật lộn trong 3 ngày qua. –

+1

Thực tiễn không tốt. Bạn có thể thay thế tài liệu đã tồn tại và đã thay đổi giữa các cuộc gọi '' 'findOne ... user.save'''. – ruX

0

theo đang chàng trai của tôi

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

Không chắc chắn bạn đang nói chuyện với ai ("anh chàng?" Thật sao?). Nhưng bạn đã đăng một câu hỏi, và trả lời (với câu trả lời được chấp nhận), 5 năm trước. –

Các vấn đề liên quan