MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ist dies eine sichere Methode zum Einfügen und Aktualisieren eines Arrays von Objekten in Mongodb?

Verwenden von bulkWrite API zur Durchführung der Updates handhabt dies besser

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

Wenn Sie mit größeren Arrays arbeiten, d. H.> 1000, sollten Sie die Schreibvorgänge in Stapeln von 500 an den Server senden, wodurch Sie eine bessere Leistung erzielen, da Sie nicht jede Anfrage an den Server senden, sondern nur einmal alle 500 Anfragen.

Für Massenoperationen erlegt MongoDB ein internes Standardlimit von 1000 Vorgängen pro Stapel und daher ist die Auswahl von 500 Dokumenten in dem Sinne gut, dass Sie eine gewisse Kontrolle über die Stapelgröße haben, anstatt MongoDB den Standard vorschreiben zu lassen, d. h. für größere Vorgänge in der Größenordnung von> 1000 Dokumenten. Für den obigen Fall im ersten Ansatz könnte man also einfach alle Arrays auf einmal schreiben, da dies klein ist, aber die 500-Auswahl ist für größere 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
    }
}