sql >> Database >  >> NoSQL >> MongoDB

Is dit een veilige manier om een ​​reeks objecten in mongodb in te voegen en bij te werken?

De bulkWrite API om de updates uit te voeren gaat hier beter mee om

mongodb.connect(mongo_url, function(err, db) {
    if(err) console.log(err)
    else {
        var mongo_products_collection = db.collection("products")

        mongoUpsert(mongo_products_collection, data_products, function() {
            db.close()
        })
    }
})

function mongoUpsert(collection, data_array, cb) {

    var bulkUpdateOps = data_array.map(function(data) {
        return {
            "updateOne": {
                "filter": { 
                    "product_id": data.product_id,
                    "post_modified": { "$ne": data.post_modified }
                },
                "update": { "$set": data },
                "upsert": true
            }
        };
    });

    collection.bulkWrite(bulkUpdateOps, function(err, r) {
        // do something with result
    });

    return cb(false);
}

Als je te maken hebt met grotere arrays, d.w.z.> 1000, overweeg dan om de schrijfbewerkingen in batches van 500 naar de server te sturen, wat je betere prestaties geeft, omdat je niet elk verzoek naar de server verzendt, maar slechts één keer in elke 500 verzoeken.

Voor bulkbewerkingen legt MongoDB een standaard interne limiet van 1000 bewerkingen per batch en dus is de keuze van 500 documenten goed in die zin dat u enige controle hebt over de batchgrootte in plaats van MongoDB de standaard te laten opleggen, d.w.z. voor grotere bewerkingen in de omvang van> 1000 documenten. Dus voor het bovenstaande geval zou men in de eerste benadering de hele array in één keer kunnen schrijven, omdat dit klein is, maar de 500-keuze is voor grotere arrays.

var ops = [],
    counter = 0;

data_array.forEach(function(data) {
    ops.push({
        "updateOne": {
            "filter": { 
                "product_id": data.product_id, 
                "post_modified": { "$ne": data.post_modified } 
            },
            "update": { "$set": data },
            "upsert": true
        }
    });
    counter++;

    if (counter % 500 == 0) {
        collection.bulkWrite(ops, function(err, r) {
            // do something with result
        });
        ops = [];
    }
})

if (counter % 500 != 0) {
    collection.bulkWrite(ops, function(err, r) {
        // do something with result
    }
}



  1. MongoDB Veel indexen versus enkele index op een reeks subdocumenten?

  2. Voorwaardelijke $ som in MongoDB

  3. 3 manieren om de week van een date te krijgen in MongoDB

  4. Mongo Query om documenten op te halen op basis van dezelfde veldwaarde en die welke niet zijn verlopen