我正在使用meteorJS
并且有user collection
我在用户个人资料中存储了一个名为'score'的值。
现在,我想更新每个用户的分数值减少10,但我在获取每个用户的分数值时遇到问题,并将其更新为"current value - 10"
。它也应该只更新不会低于0的值。
有人可以给我一个提示,告诉我如何查找和更新每个用户的个人资料值吗?
答案 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
}
});