MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Многократна актуализация на Mongoose

Да предположим, че сте имали масив от обекти, които искате да актуализирате във вашата колекция със съвпадащи идентификатори като

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 за групово записване за по-добра производителност. За версии на Mongoose >=4.3.0 които поддържат MongoDB Server 3.2.x , можете да използвате 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);

За версии на Mongoose ~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
    });
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Сървърът има предупреждения при стартиране

  2. Автоматизиране на разполагане на база данни на MongoDB

  3. MongoDB на Android

  4. Mongoose JS заявките се връщат нула или празни

  5. Условие на заявка за MongoDb при сравняване на 2 полета