2015-08-03 52 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 } } 
); 

如圖所示的「兩個」操作和連接。或者你可以在流星方法更大膽的嘗試與MongoDB中的Bulk Operations API

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將在那裏失敗。