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
}