Основным процессом здесь является использование оператора обновления $inc
, но, конечно же, существует управление 0
в качестве значения пола. Поэтому вы можете либо принять:
Users.update({ "_id": userId },{ "$inc": { "score": -10 } });
Users.update(
{ "_id": userId, "score": { "$lt": 0 } },
{ "$set": { "score": 0 } }
);
Как «две» операции и соединения, как показано. Или вы можете получить новые идеи в методах Метеора с Bulk Operations API из MongoDB:
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
. A $gt
в состоянии не получится.
В Mongoose v4 вы можете определить минимальный номер. Возьмите добычу по адресу: http://mongoosejs.com/docs/schematypes.html –