【问题标题】:decrement value in collection until 0将集合中的值递减到 0
【发布时间】:2015-10-25 14:34:57
【问题描述】:

我正在使用meteorJS 并有一个user collection,我在用户个人资料中存储了一个名为“score”的值。

现在,我想通过将每个用户的分值减 10 来更新集合,但我无法获取每个用户的分值并像 "current value - 10" 一样更新它们。它也应该只更新不会低于 0 的值。

有人能告诉我如何查找和更新每个用户的个人资料值吗?

【问题讨论】:

标签: javascript mongodb meteor


【解决方案1】:
Meteor.users.update({'profile.score': {$gte: 10}}, {$inc: {'profile.score': -10}}, {multi: true});

这能满足您的需要吗?根据需要更改选择器。

说明:我们过滤掉得分为 10 或更高的用户。我们将所有匹配用户的分数“增加”-10(因此我们将它们减少 10)。

【讨论】:

  • 您的解释不正确,只会更新一位用户。您需要通过选项 {multi : true} 更改多个。
  • @user728291 感谢您的更正。我错过了。
  • 给出例如 15 的分数,它永远不会达到 0。我相信这个答案只有在您认为分数只是 10 的因素时才是正确的。
【解决方案2】:

这里的基本流程是使用$inc更新运算符,但当然还有0作为底值的治理。因此,您可以接受:

Users.update({ "_id": userId },{ "$inc": { "score": -10 } });
Users.update(
    { "_id": userId, "score": { "$lt": 0 } },
    { "$set": { "score": 0 } }
);

如“二”操作和连接所示。或者,您可以使用 MongoDB 的 Bulk Operations API 获得更高级的 Meteor 方法:

Meteor.methods(
    "alterUserScore": function(userId,amount) {
        var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

        var bulk = db.collection('users').inititializeOrderedBulkOp();

        bulk.find({ "_id": userId }).updateOne({ "$inc": { "score": amount } });
        bulk.find({ "_id": userId, "score": { "$lt": 0 } }).updateOne({
            "$set": { "score": 0 }
        });

        bulk.execute(
            Meteor.bindEnvironment(
                function(err,result) {
                    // maybe do something here
                },
                function(error) {
                    // report real bad here
                }
            )
        );
    }
);

“服务器”请求的优势在于,即使仍然是“两个”更新操作,来自服务器的实际请求和响应也只有“一个”请求和“一个”响应。所以这比两次往返效率高得多。尤其是从浏览器客户端启动时。

如果您不这样做,那么您可能会错过一些事情,例如当前值为 6 并且您想将其减少到 0。条件中的$gt 将在那里失败。

【讨论】:

    【解决方案3】:

    您可以尝试将此作为 Schema。

    const Customer = new Schema({
      cash: {
        type: Number,
        min: 0
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2022-12-30
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多