【问题标题】:Node + mongo-native: how to find and update value in collection?Node + mongo-native:如何在集合中查找和更新值?
【发布时间】:2012-09-23 02:44:06
【问题描述】:

我有用户帐户,按时间到期。时间以毫秒为单位存储在 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”),对于每个用户,它都存储在最近的输入中(name="id")。

在我尝试添加天数后,即使我没问题,我的收藏也会损坏。有谁知道为什么?谢谢!

【问题讨论】:

  • 您能否详细说明“我的收藏已损坏”?它到底发生了什么?
  • 既然你将 expires 存储为一个数字,为​​什么不直接使用 $inc 运算符呢?
  • @IlyaRusanen 你能解释一下你的收藏在这次手术后的样子吗?以及为什么不能使用 $inc?
  • @AsyaKamsky,谢谢 - $inc 工作完美,但不幸的是,这并不是我所需要的。我需要 get 当前值,确定它是在当前时刻之前还是之后,并根据它设置新值(请参阅我的代码)。因此,自动 $inc 不能使用,尽管它工作得很好。损坏 - 意味着 mViewer(我的 MongoDB 管理面板)无法读取。它说我的 MongoDB 在错误更新后已损坏。
  • 你可以做一个有条件的更新,你只需要做两个更新(但只有一个会生效)

标签: node.js mongodb collections find


【解决方案1】:

既然你说你需要根据当前值是否大于“现在”来进行不同的更新,为什么不使用这两个更新:

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

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

请注意,此处的更新顺序很重要,以确保两个语句中只有一个有效。

【讨论】:

  • 太棒了,就像一个魅力! И, кажется, вы говорите по-русски, так что еще раз спасибо! :)
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多