sql >> Databasteknik >  >> NoSQL >> MongoDB

Är detta ett säkert sätt att infoga och uppdatera en rad objekt i mongodb?

Använda bulkWrite API för att utföra uppdateringarna hanterar detta bättre

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

Om du har att göra med större arrayer, dvs> 1000, överväg att skicka skrivningarna till servern i omgångar om 500, vilket ger dig bättre prestanda eftersom du inte skickar varje begäran till servern, bara en gång av 500 förfrågningar.

För bulkoperationer inför MongoDB en intern standardgräns av 1000 operationer per batch och så valet av 500 dokument är bra i den meningen att du har viss kontroll över batchstorleken snarare än att låta MongoDB införa standarden, det vill säga för större operationer i storleksordningen> 1000 dokument. Så för ovanstående fall i det första tillvägagångssättet skulle man bara kunna skriva hela arrayen på en gång eftersom den är liten men 500-valet är för större arrayer.

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. ansluta en mongodb skapad i mongolab genom en java-applikation

  2. Custom Cascading in Spring Data MongoDB

  3. Vad är skillnaden mellan StackExchange.Redis och StackExchange.Redis.StrongName?

  4. Bulk insatsprestanda i MongoDB för stora samlingar