2015-08-03 2 views
0

Я использую meteorJS и имею user collection, где я сохранил значение, называемое «оценка» в профиле пользователя.декремент в коллекции до 0

Теперь я хочу обновить коллекцию с уменьшением значения оценки на 10 для каждого пользователя, но у меня возникают проблемы с получением значения оценки для каждого пользователя и обновлением их, как "current value - 10". Он также должен обновлять значения, которые не станут ниже 0.

Может ли кто-нибудь дать мне подсказку, как найти и обновить значение для каждого пользователя профиля?

+0

В Mongoose v4 вы можете определить минимальный номер. Возьмите добычу по адресу: http://mongoosejs.com/docs/schematypes.html –

ответ

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

Выполняет ли это то, что вам нужно? При необходимости измените селектор.

Пояснение: Мы отфильтровываем пользователей, у которых есть оценка 10 или более. Мы «увеличиваем» все совпадающие оценки пользователей на -10 (поэтому мы уменьшаем их на 10).

+0

Ваши объяснения неверны, и только один пользователь будет обновлен. Вам нужно передать параметр {multi: true}, чтобы изменить более одного. – user728291

+0

@ user728291 Спасибо за исправление. Я пропустил это. – Oskar

2

Основным процессом здесь является использование оператора обновления $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 в состоянии не получится.

Смежные вопросы