MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongoose đa cập nhật

Giả sử bạn có một loạt các đối tượng mà bạn muốn cập nhật trong bộ sưu tập của mình trên các id phù hợp như

var soldItems = [
        {
            "_id": 1,
            "value": 4
        },
        {
            "_id": 2,
            "value": 27
        }
    ];

thì bạn có thể sử dụng forEach() trên mảng để lặp lại nó và cập nhật bộ sưu tập của bạn:

soldItems.forEach(function(item)){
    Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
});

hoặc sử dụng lời hứa như

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);
});

hoặc sử dụng 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);
}); 

Đối với các mảng lớn hơn, bạn có thể tận dụng lợi thế của việc sử dụng API ghi hàng loạt để có hiệu suất tốt hơn. Đối với phiên bản Mongoose >=4.3.0 hỗ trợ MongoDB Server 3.2.x , bạn có thể sử dụng bulkWrite() để cập nhật. Ví dụ sau đây cho thấy cách bạn có thể thực hiện điều này:

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);

Đối với các phiên bản Mongoose ~3.8.8, ~3.8.22, 4.x hỗ trợ Máy chủ MongoDB >=2.6.x , bạn có thể sử dụng Bulk API như sau

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
    });
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cấu hình MongoDB HostName / URI

  2. Gắn Trang Blob dưới dạng VHD trong một tệp hàng loạt

  3. Truy vấn giá trị null trong MongoDB

  4. MongoDB được nhúng trong java

  5. Cách kết nối với mongoDB Atlas bằng mongoose