MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy jest to bezpieczny sposób wstawiania i aktualizowania tablicy obiektów w mongodb?

Korzystanie z bulkWrite API do przeprowadzania aktualizacji radzi sobie z tym lepiej

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

Jeśli masz do czynienia z większymi tablicami, tj.> 1000, rozważ wysyłanie zapisów do serwera w partiach po 500, co zapewnia lepszą wydajność, ponieważ nie wysyłasz każdego żądania do serwera, tylko raz na 500 żądań.

W przypadku operacji zbiorczych MongoDB nakłada domyślny limit wewnętrzny 1000 operacji na partię, a więc wybór 500 dokumentów jest dobry w tym sensie, że masz pewną kontrolę nad rozmiarem partii, zamiast pozwolić MongoDB narzucić domyślne, tj. W przypadku większych operacji o wielkości> 1000 dokumentów. Tak więc w powyższym przypadku w pierwszym podejściu można po prostu zapisać całą tablicę naraz, ponieważ jest to mała, ale wybór 500 dotyczy większych tablic.

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Opcje hostingu MongoDB po usunięciu dodatku Heroku mLab

  2. Mongodb nie może znaleźć użytkownika [chroniony adres e-mail]

  3. Nie można znaleźć „IdentityContext” (brakuje dyrektywy using lub odwołania do zestawu)

  4. Jak działa modyfikator $inc ze współbieżnymi żądaniami w mongodb?

  5. return Model.create(arr).exec() nie działa w manguście