我有用户帐户,按时间到期。时间以毫秒为单位存储在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');
});
});
});
}
要启动更新日期功能,我在前端使用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是一个字符串解码的ObejctID(如“506a1438be4f73c11c000002”),对于每个用户,它存储在最近的输入(name =“id”)中。
在我尝试添加日子之后,即使我没事,我的收藏也会受损。有谁知道为什么?谢谢!
答案 0 :(得分:2)
由于您说您需要根据当前值是否大于“现在”进行不同的更新,为什么不使用这两个更新来执行此操作:
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}})
我认为这比你现在的逻辑更安全。
请注意,此处的更新顺序至关重要,以确保两个语句中只有一个有效。