2012-10-02 50 views
1

我有用戶帳戶,按時間到期。時間以毫秒爲單位存儲在MongoDB中。用戶由_id標識。這裏的架構:Node + mongo-native:如何查找和更新集合中的值?

{ 
    "_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); 
     }); 
    }); 

瓦爾ID是一個字符串解碼ObejctID(如「506a1438be4f73c11c000002」),對每一位用戶它存儲在最近的輸入(NAME =「ID 「)。

在我嘗試添加日子之後,即使我收到了好評,我的收藏集也已損壞。有誰知道爲什麼?謝謝!

+0

您能否詳細說明「我的收藏已損壞」?究竟發生了什麼? – jmikola

+1

由於您將過期存儲爲數字,爲何不使用$ inc操作符? –

+1

@IlyaRusanen你能解釋你的收藏在這次手術後的樣子嗎?爲什麼你不能使用$ inc? –

回答

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

我覺得這是更安全比你現在的邏輯。

請注意,這裏的更新順序很重要,以確保只有一條語句有效。

+0

神奇的,像一個魅力工作! И,кажется,выговоритепо-русски,такчтощиразспасибо! :) – f1nn