假設你有對象的數組,你想在您的收藏更新匹配的IDS像
var soldItems = [
{
"_id": 1,
"value": 4
},
{
"_id": 2,
"value": 27
}
];
那麼你可以使用陣列上的forEach()
方法循環並不斷更新您的收藏:
soldItems.forEach(function(item)){
Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
});
或使用的承諾作爲
var updates = [];
soldItems.forEach(function(item)){
var updatePromise = Model.update({"_id": item._id}, {"$set": {"value": item.value }});
updates.push(updatePromise);
});
Promise.all(updates).then(function(results){
console.log(results);
});
或使用map()
var updates = soldItems.map(function(item)){
return Model.update({"_id": item._id}, {"$set": {"value": item.value }});
});
Promise.all(updates).then(function(results){
console.log(results);
});
對於較大的陣列,您可能需要使用批量寫API獲得更好的性能優勢。對於支持MongoDB Server 3.2.x
, 的Mongoose版本>=4.3.0
,您可以使用bulkWrite()
進行更新。下面的例子演示瞭如何去了解這一點:
var bulkUpdateCallback = function(err, r){
console.log(r.matchedCount);
console.log(r.modifiedCount);
}
// Initialise the bulk operations array
var bulkOps = soldItems.map(function (item) {
return {
"updateOne": {
"filter": { "_id": item._id } ,
"update": { "$set": { "value": item.value } }
}
}
});
// Get the underlying collection via the native node.js driver collection object
Model.collection.bulkWrite(bulkOps, { "ordered": true, w: 1 }, bulkUpdateCallback);
對於貓鼬版本~3.8.8, ~3.8.22, 4.x
支持MongoDB的服務器>=2.6.x
,你可以在Bulk API
如下
var bulk = Model.collection.initializeOrderedBulkOp(),
counter = 0;
soldItems.forEach(function(item) {
bulk.find({ "_id": item._id }).updateOne({
"$set": { "value": item.value }
});
counter++;
if (counter % 500 == 0) {
bulk.execute(function(err, r) {
// do something with the result
bulk = Model.collection.initializeOrderedBulkOp();
counter = 0;
});
}
});
// Catch any docs in the queue under or over the 500's
if (counter > 0) {
bulk.execute(function(err,result) {
// do something with the result here
});
}
我以前嘗試過類似的東西,我循環通過我的價值觀。我的問題是,如果我採取這種方法,我在哪裏設置res.end();因爲如果我在foreach結束後設置res.end(),我仍然有一堆回調等待我的Model.update完成。 – user3862830
通過回調(我猜) - 嘗試做一個func函數(回調){callback();}'更新數據庫中的所有文檔並將回調函數返回到主函數中,在那裏你將完成你的工作;只是嘗試這種方式。 – narainsagar
一個函數(比如:'callbackFunc'),它會更新你的所有文檔,然後從被調用的地方返回回調(假設:'mainFunc'),這意味着你的所有文檔將被更新(意味着callbackFunc完成),那麼你會/調用'res.end()' – narainsagar