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

MongoDB:Kopírování pole do jiného pole ve stejném dokumentu

U relativně malých dat můžete výše uvedeného dosáhnout iterací kolekce pomocí snapshot pomocí kurzoru forEach() a každý dokument aktualizujte následovně:

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 
    db.wholesalers.updateOne(
        { "_id": doc._id },
        { "$set": { "brandsNetherlands": doc.brands } }
    );
});

Zatímco toto je optimální pro malé kolekce, výkon u velkých kolekcí je značně snížen, protože smyčkování přes velkou datovou sadu a odesílání každé aktualizační operace na jeden požadavek na server znamená výpočetní penalizaci.

Bulk() API přichází na pomoc a výrazně zlepšuje výkon, protože operace zápisu jsou odesílány na server pouze jednou hromadně. Efektivity je dosaženo, protože metoda neposílá každý požadavek na zápis na server (jako u aktuálního příkazu k aktualizaci v rámci forEach() smyčka), ale pouze jednou z 1000 požadavků, díky čemuž jsou aktualizace efektivnější a rychlejší než v současnosti.

Použití stejného konceptu výše s forEach() smyčky k vytvoření dávek, můžeme kolekci hromadně aktualizovat následovně.

V této ukázce Bulk() API dostupné ve verzích MongoDB >= 2.6 and < 3.2 používá initializeUnorderedBulkOp() způsob, jak paralelně, stejně jako v nedeterministickém pořadí, provádět operace zápisu v dávkách:

var bulk =db.wholesalers.initializeUnorderedBulkOp(),counter =0; // čítač pro sledování velikosti dávkové aktualizace

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 

    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "brandsNetherlands": doc.brands } 
    });

    counter++; // increment counter
    if (counter % 1000 == 0) {
        bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk = db.wholesalers.initializeUnorderedBulkOp();
    }
});

Další příklad platí pro novou verzi MongoDB 3.2 která od té doby zavrhla Bulk() API a poskytla novější sadu API pomocí bulkWrite() .

Používá stejné kurzory jako výše, ale vytváří pole s hromadnými operacemi pomocí stejného forEach() kurzorová metoda pro přesunutí každého dokumentu hromadného zápisu do pole. Protože příkazy zápisu nemohou přijmout více než 1000 operací, je potřeba seskupit operace tak, aby měly maximálně 1000 operací a znovu inicializovat pole, když smyčka dosáhne 1000 iterací:

var cursor = db.wholesalers.find({
         "brands": { "$exists": true, "$type": 4 } 
    }),
    bulkUpdateOps = [];

cursor.snapshot().forEach(function(doc){ 
    bulkUpdateOps.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "brandsNetherlands": doc.brands } }
         }
    });

    if (bulkUpdateOps.length === 1000) {
        db.wholesalers.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = [];
    }
});         

if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }



  1. jak získat datum vytvoření z ID objektu v mongoose?

  2. Problémy s výkonem omezené kolekce

  3. Chyba E QUERY [vlákno1] SyntaxError:neplatné ID vlastnosti @(shell) pomocí a/nebo s find()

  4. Scala - Vytvořte objekt IndexedDatasetSpark