我正在使用meteorJS
並且有一個user collection
,其中我在用戶配置文件中存儲了一個名爲'分數'的值。集合中的遞減值直到0
現在,我想用每個用戶的分數值遞減10來更新集合,但是我在爲每個用戶獲取分數值時出現問題,並將其更新爲"current value - 10"
。它也應該只更新值不會低於0.
有人可以給我一個提示如何找到並更新每個用戶的值配置文件?
我正在使用meteorJS
並且有一個user collection
,其中我在用戶配置文件中存儲了一個名爲'分數'的值。集合中的遞減值直到0
現在,我想用每個用戶的分數值遞減10來更新集合,但是我在爲每個用戶獲取分數值時出現問題,並將其更新爲"current value - 10"
。它也應該只更新值不會低於0.
有人可以給我一個提示如何找到並更新每個用戶的值配置文件?
Meteor.users.update({'profile.score': {$gte: 10}}, {$inc: {'profile.score': -10}}, {multi: true});
這是否完成您所需要的?根據需要更改選擇器。
說明:我們篩選出10分或以上的用戶。我們將所有匹配用戶的分數「增加」-10(所以我們減少10)。
您的解釋是不正確的,只有一個用戶將被更新。您需要傳遞選項{multi:true}以更改多個選項。 – user728291
@ user728291感謝您的更正。我錯過了。 – Oskar
這裏的基本過程是使用$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
將在那裏失敗。
在Mongoose v4中,您可以定義最小數量。採取掠奪:http://mongoosejs.com/docs/schematypes.html –