1

私はユーザーアカウントを持っており、時間の経過とともに期限切れになります。時間はミリ秒単位のlongとしてMongoDBに保存されます。ユーザーは_idで識別されます。スキーマは次のとおりです。

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

ユーザーアカウントに+N日を追加するには、find()を使用してからupdate()を使用します(理由はわかりませんが、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"など)であり、すべてのユーザーにとって、最も近いinput(name = "id")に格納されます。

日数を追加しようとすると、OKになっても、コレクションが破損します。誰かが理由を知っていますか?ありがとう!

4

1 に答える 1

2

現在の値が「現在」より大きいかどうかに応じて異なる更新を行う必要があると言うので、次の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}})

これは、現在のロジックよりも安全だと思います。

ここでの更新の順序は、2つのステートメントのうち1つだけが有効になるようにするために重要であることに注意してください。

于 2012-10-02T20:44:07.437 に答える