sql >> Database teknologi >  >> NoSQL >> MongoDB

Er dette en sikker måde at indsætte og opdatere en række objekter i mongodb?

Brug af bulkWrite API til at udføre opdateringerne håndterer dette bedre

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

Hvis du har at gøre med større arrays, dvs.> 1000, så overvej at sende skrivningerne til serveren i batches af 500, hvilket giver dig en bedre ydeevne, da du ikke sender hver anmodning til serveren, kun én gang for hver 500 anmodninger.

For bulkoperationer pålægger MongoDB en intern standardgrænse 1000 operationer pr. batch, og så er valget af 500 dokumenter godt i den forstand, at du har en vis kontrol over batchstørrelsen i stedet for at lade MongoDB påtvinge standarden, dvs. for større operationer i størrelsesordenen> 1000 dokumenter. Så for ovenstående tilfælde i den første tilgang kunne man bare skrive hele arrayet på én gang, da dette er lille, men 500-valget er til større 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 Shell - adgang til samling med punktum i navnet?

  2. Understøtter AWS DocumentDB at deltage i 3+ samlinger i en enkelt forespørgsel?

  3. MongoDB satte grænsen til $inc

  4. Sådan konfigureres MySQL Master-Slave Replication på Ubuntu 18.04