sql >> Database >  >> NoSQL >> MongoDB

Mongodb foreach voor geneste collectie om documenten bij te werken/kopiëren naar een andere collectie

Als je de hele collectie gaat updaten, dan is de limit op uw cursor in uw huidige code is niet nodig. De fout die u krijgt is omdat de mappingData veld in de products collectie heeft geen subdocumentveld genaamd array . Van uw voorbeeld in de vraag, alleen de title subdocument veld is beschikbaar, en dat is degene die je wilt.

Afhankelijk van de grootte van de productcollectie, kan het invoegen van de geconverteerde documenten in een nieuwe collectie van invloed zijn op uw activiteiten. U kunt trage invoegprestaties voorkomen door de nieuwe ongeordende bulk insert API dat uw invoegbewerkingen stroomlijnt door ze in bulk te verzenden, en nog beter, het geeft u echte feedback over wat is gelukt en wat niet.

De volgende API-bewerking voor bulksgewijs invoegen wordt ingevoegd in newcollection de gewenste gegevensstructuur waar de nieuwe documenten worden gemaakt binnen de forEach() loop, met behulp van de haakjesnotatie om nieuwe eigenschappen te creëren. In de bulkbijlage stuurt u de bewerkingen naar de server in batches van 1000, wat u een betere prestatie geeft omdat u niet elk verzoek naar de server verzendt, maar slechts één keer per 1000 verzoeken:

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

Met het bovenstaande voorbeeld zou de feedback die u krijgt van de bulk-API-bewerking de volgende indeling hebben:

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

De nieuwe collectie opvragen db.newcollection.find() zal opleveren:

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

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



  1. Mongodb-query op geneste array-elementen

  2. Groepsaggregatie met behulp van lentegegevens mongodb

  3. Oplossing voor Bulk FindAndModify in MongoDB

  4. MongoDB/Mongoose Hoe koppel ik twee db-items zonder conflicten?