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

Mongodb foreach dla kolekcji zagnieżdżonej w celu aktualizacji/kopiowania dokumentów do innej kolekcji

Jeśli zamierzasz zaktualizować całą kolekcję, to limit na kursorze w aktualnym kodzie nie jest konieczne. Pojawia się błąd, ponieważ mappingData pole w products kolekcja nie ma pola poddokumentu o nazwie array . Z przykładu w pytaniu tylko title pole poddokumentu jest dostępne i to jest to, czego potrzebujesz.

W zależności od wielkości kolekcji produktów, wstawienie przekonwertowanych dokumentów do nowej kolekcji może wpłynąć na Twoje operacje. Możesz uniknąć powolnej wydajności wstawiania, używając nowego nieuporządkowanego interfejs API wstawiania zbiorczego który usprawnia operacje wstawiania, wysyłając je zbiorczo, a jeszcze lepiej, daje prawdziwą informację zwrotną na temat tego, co się udało, a co nie.

Następująca operacja API zbiorczego wstawiania spowoduje wstawienie do newcollection pożądana struktura danych, w której tworzone są nowe dokumenty w forEach() pętla przy użyciu notacji w nawiasie do tworzenia nowych nieruchomości. We wstawce zbiorczej będziesz wysyłać operacje do serwera w partiach po 1000, co zapewnia lepszą wydajność, ponieważ nie wysyłasz każdego żądania do serwera, tylko raz na 1000 żądań:

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

W powyższym przykładzie informacja zwrotna uzyskana z operacji zbiorczego interfejsu API będzie miała następujący format:

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

Zapytanie o nową kolekcję db.newcollection.find() da:

/* 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. Jak wyniki sortowania w nodejs - wyszukiwanie mongodb, ale wywołując metodę dynamiczną

  2. MongoDb aktualizuje obiekt w tablicy przy pierwszym wystąpieniu od ostatniego

  3. mongodb:jak odfiltrować rekordy, które powstały dzisiaj?

  4. Porównanie dat w mongodb

  5. Szybkość aktualizacji Mongo