Node + mongo-native:如何查找和更新集合中的值?

我有用户帐户,按时间到期。 时间以毫秒为单位存储在MongoDB中。 用户由_id标识。 这是架构:

{ "_id": { "$oid": "506a1438be4f73c11c000002" }, "email": "admin", "password": "admin", "first_name": "admin", "last_name": "admin", "country": "USA", "group": "admin", "expires": 1349129272918 } 

要为用户帐户添加+ N天,我使用find(),然后更新()(不知道为什么,但findAndUpdate无法获得以前的值):

 app.post('/users/add', function(req,res){ addDays(req.body.id, req.body.days, function(status){ res.send(200); }) }); function addDays(id, days, callback) { var obj_id = BSON.ObjectID.createFromHexString(id); db.collection("users", function(error, collection) { collection.find({_id: obj_id}, function(err, user) { var oldexp = user.expires; if (oldexp < new Date().getTime() ) { var newexp = new Date().getTime() + (86400000*days); } else { var newexp = oldexp + (86400000*days); } collection.update({_id: obj_id}, { $set: { "expires": parseInt(newexp) } }, function(err, result) { callback('ok'); }); }); }); } 

要启动更新datefunction,我在前端使用JS:

  $(".addDays").live("click", function(){ var that = $(this); var id = that.closest('.row').find('input[name=id]').val(); alert(id); $.post('/users/add', { "id": id, "days": 10 }, function(data){ alert(data); }); }); 

Var id是一个string解码的ObejctID(比如“506a1438be4f73c11c000002”),对于每个用户,它都存储在最近的input(name =“id”)中。

在我尝试添加日子之后,即使我好起来,我的collections也会被损坏。 有谁知道为什么? 谢谢!

既然你说你需要进行不同的更新,取决于当前值是否大于“now”,为什么不用这两个更新:

 now = new Date().getTime(); db.users.update({_id:obj_id, expires:{$gte:now}, {$inc:{expires:now+{86400000*days}}) db.users.update({_id:obj_id, expires:{$lt:now}, {$set:{expires:now+86400000*days}}) 

我认为这比现在的逻辑更安全。

请注意,这里的更新顺序很重要,以确保只有两个声明中的一个有效。