Hvis du vil opdatere hele samlingen, er limit
på din markør i din nuværende kode er ikke nødvendigt. Fejlen du får er fordi mappingData
feltet i products
samling har ikke et underdokumentfelt kaldet array
. Fra dit eksempel i spørgsmålet, kun title
underdokumentfelt er tilgængeligt, og det er det, du ønsker.
Afhængigt af størrelsen af produktsamlingen kan indsættelse af de konverterede dokumenter i en ny samling påvirke dine operationer. Du kan undgå langsom insert-ydeevne ved at bruge den nye uordnede bulk insert API der strømliner dine indstiksoperationer ved at sende dem i bulk, og endnu bedre, det giver dig reel feedback om, hvad der lykkedes, og hvad der mislykkedes.
Følgende masseindsættelse af API-operation vil indsætte i newcollection
den ønskede datastruktur, hvor de nye dokumenter oprettes i produktindsamlingscursorens forEach()
loop ved at bruge parentesnotation
at skabe nye ejendomme. I masseindlægget vil du sende operationerne til serveren i batches af 1000, hvilket giver dig en bedre ydeevne, da du ikke sender hver anmodning til serveren, kun én gang for hver 1000 anmodninger:
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(); }
Med ovenstående eksempel ville den feedback, du får fra bulk API-operationen, være i dette format:
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
Forespørger på den nye samling db.newcollection.find()
vil give:
/* 0 */
{
"_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
"title" : "Toshiba Satellite Pro 4600 PIII800",
"Manufacturer" : "Toshiba"
}
/* 1 */
{
"_id" : ObjectId("56558b0427adb60c9f7e6f8e"),
"title" : "Apple Ihone",
"Manufacturer" : undefined
}