将集合中的值递减到0

时间:2015-08-03 13:03:55

标签: javascript mongodb meteor

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

现在,我想更新每个用户的分数值减少10,但我在获取每个用户的分数值时遇到问题,并将其更新为"current value - 10"。它也应该只更新不会低于0的值。

有人可以给我一个提示,告诉我如何查找和更新每个用户的个人资料值吗?

3 个答案:

答案 0 :(得分:7)

Meteor.users.update({'profile.score': {$gte: 10}}, {$inc: {'profile.score': -10}}, {multi: true});

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

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

答案 1 :(得分: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将在那里失败。

答案 2 :(得分:0)

您可以尝试将其作为架构。

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