MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongodb foreach за вложена колекция за актуализиране/копиране на документи в друга колекция

Ако ще актуализирате цялата колекция, тогава limit върху вашия курсор в текущия ви код не е необходимо. Грешката, която получавате, е защото mappingData поле в products колекцията няма поле за поддокумент, наречено array . От вашия пример във въпроса, само title е налично поле за поддокумент и това е това, което искате.

В зависимост от размера на колекцията от продукти, вмъкването на преобразуваните документи в нова колекция може да повлияе на вашите операции. Можете да избегнете бавната производителност на вмъкване, като използвате новия неподреден API за масово вмъкване който рационализира вашите операции за вмъкване, като ги изпраща групово, и още по-добре, дава ви реална обратна връзка за това какво е успяло и какво е неуспешно.

Следната API операция за групово вмъкване ще вмъкне в newcollection желаната структура от данни, където се създават новите документи в forEach() цикъл, използвайки нотация в скоби за създаване на нови имоти. В груповото вмъкване вие ​​ще изпращате операциите до сървъра на партиди от 1000, което ви осигурява по-добра производителност, тъй като не изпращате всяка заявка до сървъра, а само веднъж на всеки 1000 заявки:

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

С горния пример обратната връзка, която получавате от груповата операция на API, ще бъде в този формат:

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

Запитване за новата колекция db.newcollection.find() ще даде:

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

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Добавете ново поле към всеки документ в колекция MongoDB

  2. Актуализирайте няколко документа в колекция, като използвате превключване на регистъра на буквите

  3. Как да получите резултатите от командата mongo в плосък файл

  4. Не е намерен десериализатор на Json за тип Option[reactivemongo.bson.BSONObjectID]

  5. Геопространствено индексиране Не е намерено картографиране за поле с YAML