sql >> Databáze >  >> NoSQL >> MongoDB

Je to bezpečný způsob vkládání a aktualizace pole objektů v mongodb?

Pomocí bulkWrite API pro provádění aktualizací to zvládá lépe

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

Pokud máte co do činění s většími poli, tj.> 1000, zvažte odesílání zápisů na server v dávkách po 500, což vám poskytuje lepší výkon, protože na server neposíláte každý požadavek, ale pouze jednou za každých 500 požadavků.

Pro hromadné operace MongoDB zavádí výchozí interní limit 1000 operací na dávku, takže výběr 500 dokumentů je dobrý v tom smyslu, že máte určitou kontrolu nad velikostí dávky, než aby MongoDB uložil výchozí nastavení, tj. pro větší operace v rozsahu> 1000 dokumentů. Takže pro výše uvedený případ v prvním přístupu by bylo možné napsat celé pole najednou, protože toto je malé, ale volba 500 je pro větší pole.

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. Dotazování dat z MongoDB pomocí GraphQL v Django:Get-Go (1)

  2. Mongoose naplňuje a vrací prázdné pole

  3. 'TypeError:meme.find(...).forEach is not a function' v mongoose node js?

  4. Vestavěný dokument MongoDB nezíská ID při uložení pomocí ovladače C#