sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Es esta una forma segura de insertar y actualizar una matriz de objetos en mongodb?

Usando bulkWrite La API para realizar las actualizaciones maneja esto mejor

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

Si está tratando con matrices más grandes, es decir,> 1000, considere enviar las escrituras al servidor en lotes de 500, lo que le brinda un mejor rendimiento ya que no está enviando todas las solicitudes al servidor, solo una de cada 500 solicitudes.

Para operaciones masivas, MongoDB impone un límite interno predeterminado de 1000 operaciones por lote, por lo que la elección de 500 documentos es buena en el sentido de que tiene cierto control sobre el tamaño del lote en lugar de dejar que MongoDB imponga el valor predeterminado, es decir, para operaciones más grandes en la magnitud de> 1000 documentos. Entonces, para el caso anterior en el primer enfoque, uno podría simplemente escribir toda la matriz a la vez, ya que es pequeña, pero la opción 500 es para matrices más grandes.

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