MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Esta é uma maneira segura de inserir e atualizar uma matriz de objetos no mongodb?


Usando o bulkWrite API para realizar as atualizações lida com isso melhor
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);
}

Se você estiver lidando com matrizes maiores, ou seja,> 1000, considere enviar as gravações para o servidor em lotes de 500, o que oferece um desempenho melhor, pois você não está enviando todas as solicitações ao servidor, apenas uma vez a cada 500 solicitações.

Para operações em massa, o MongoDB impõe um limite interno padrão de 1.000 operações por lote e, portanto, a escolha de 500 documentos é boa no sentido de que você tem algum controle sobre o tamanho do lote, em vez de deixar o MongoDB impor o padrão, ou seja, para operações maiores na magnitude de> 1.000 documentos. Portanto, para o caso acima, na primeira abordagem, pode-se escrever todo o array de uma só vez, pois isso é pequeno, mas a opção 500 é para arrays maiores.
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
    }
}