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

Mongodb foreach pro vnořenou kolekci pro aktualizaci/kopírování dokumentů do jiné kolekce

Pokud se chystáte aktualizovat celou kolekci, pak limit na vašem kurzoru ve vašem aktuálním kódu není nutné. Chyba, kterou dostáváte, je způsobena mappingData v products kolekce nemá pole vnořeného dokumentu s názvem array . Z vašeho příkladu v otázce pouze title pole vnořeného dokumentu je k dispozici a to je to, co chcete.

V závislosti na velikosti kolekce produktů může vložení převedených dokumentů do nové kolekce ovlivnit vaše operace. Můžete se vyhnout pomalému výkonu vkládání pomocí nového neuspořádaného rozhraní API pro hromadné vkládání který zjednodušuje vaše operace vkládání tím, že je odesílá hromadně, a ještě lépe vám poskytuje skutečnou zpětnou vazbu o tom, co se povedlo a co selhalo.

Následující operace hromadného vložení API se vloží do newcollection požadovanou datovou strukturu, kde se nové dokumenty vytvářejí v rámci kurzoru kolekce produktů forEach() smyčky pomocí závorky k vytvoření nových vlastností. V hromadném vložení budete na server posílat operace v dávkách po 1000, což vám poskytne lepší výkon, protože na server neposíláte každý požadavek, ale pouze jednou za každých 1000 požadavků:

var bulk = db.newcollection.initializeUnorderedBulkOp(),   
    counter = 0;

db.products.find().forEach(function(doc) { 
    var document = {};
    if (doc.mappingData.title) document["title"] = doc[doc.mappingData.title];
    document["Manufacturer"] = doc.Manufacture;
    bulk.insert(document);
    counter++;
    if (counter % 1000 == 0) {
        bulk.execute();
        bulk = db.newcollection.initializeUnorderedBulkOp();
    }
});

if (counter % 1000 != 0) { bulk.execute(); }

Ve výše uvedeném příkladu bude zpětná vazba, kterou získáte z hromadné operace API, v tomto formátu:

BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

Dotaz na novou kolekci db.newcollection.find() přinese:

/* 0 */
{
    "_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
    "title" : "Toshiba Satellite Pro 4600 PIII800",
    "Manufacturer" : "Toshiba"
}

/* 1 */
{
    "_id" : ObjectId("56558b0427adb60c9f7e6f8e"),
    "title" : "Apple Ihone",
    "Manufacturer" : undefined
}



  1. Mongoose – Agregace $match na základě hodnot výčtu

  2. Jak exportovat všechny sbírky v MongoDB?

  3. Vrací modul.require(...).* kopii souboru module.exports.* nebo jeho odkaz?

  4. Vložte do mongodb pomocí perlu