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

Agregar y actualizar MongoDB

Para mejorar el rendimiento, especialmente cuando se trata de grandes colecciones, aproveche el uso de Bulk() API para actualizaciones masivas, ya que enviará las operaciones al servidor en lotes (por ejemplo, digamos un tamaño de lote de 1000), lo que le brinda un rendimiento mucho mejor ya que no enviará todas las solicitudes al servidor (como lo está haciendo actualmente). hacer con la declaración de actualización dentro de forEach() loop), pero solo una de cada 1000 solicitudes, lo que hace que sus actualizaciones sean más eficientes y rápidas de lo que son actualmente.

Los siguientes ejemplos demuestran este enfoque, el primero usa el Bulk() API disponible en las versiones de MongoDB >= 2.6 and < 3.2 . Actualiza todos los documentos en los clients colección cambiando el nb_orders_1year campos con valores de los resultados de agregación.

Desde aggregate() El método devuelve un cursor , Puede utilizar la colección de salida de agregación forEach() para iterarlo y acceder a cada documento, configurando así las operaciones de actualización masiva en lotes para luego enviarlas a través del servidor de manera eficiente con la API:

var bulk = db.clients.initializeUnorderedBulkOp(),
    pipeline = [
        {
            "$match": { "date_order": { "$gt": v_date1year } }
        },
        {
            "$group": {
                "_id": "$id_client", 
                "count": { "$sum" : 1 }
            }
        },
        { "$out": "tmp_indicators" }        
    ],
    counter = 0;

db.orders.aggregate(pipeline);  
db.tmp_indicators.find().forEach(function (doc) {       
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "nb_orders_1year": doc.count }
    });

    counter++;
    if (counter % 1000 == 0) {
        bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk = db.clients.initializeUnorderedBulkOp();
    }
});
// Clean up remaining operations in queue
if (counter % 1000 != 0) { bulk.execute(); }

El siguiente ejemplo se aplica a la nueva versión de MongoDB 3.2 que desde ha dejado obsoleto el Bulk API y proporcionó un conjunto más nuevo de apis usando bulkWrite() .

Utiliza el mismo cursor que el anterior pero en lugar de iterar el resultado, crea la matriz con las operaciones masivas usando su map() método:

 var pipeline = [
        {
            "$match": { "date_order": { "$gt": v_date1year } }
        },
        {
            "$group": {
                "_id": "$id_client", 
                "count": { "$sum" : 1 }
            }
        },
        { "$out": "tmp_indicators" }        
    ];
db.orders.aggregate(pipeline);
var bulkOps = db.tmp_indicators.find().map(function (doc) { 
        return { 
            "updateOne": { 
                "filter": { "_id": doc._id } ,              
                "update": { "$set": { "nb_orders_1year": doc.count } } 
            }         
        };
    });

db.clients.bulkWrite(bulkOps, { "ordered": true });