sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb foreach for indlejret samling for at opdatere/kopiere dokumenter til en anden samling

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
}



  1. Robo 3T-fejl:Netværket er ikke tilgængeligt

  2. som forespørgsel i mongoDB

  3. Brugerdefineret metode til opdateringsforespørgsel med forårsdata MongoRepository

  4. Opdeling af poster i en samling i MongoDB