sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb foreach för kapslad samling för att uppdatera/kopiera dokument till en annan samling

Om du ska uppdatera hela samlingen är limit på markören i din nuvarande kod är inte nödvändigt. Felet du får beror på att mappingData fältet i products samlingen har inte ett underdokumentfält som heter array . Från ditt exempel i frågan, bara title underdokumentfält är tillgängligt, och det är det du vill ha.

Beroende på storleken på produktsamlingen kan det påverka din verksamhet om du infogar de konverterade dokumenten i en ny samling. Du kan undvika långsam insättningsprestanda med den nya oordnade bulk insert API som effektiviserar dina skäroperationer genom att skicka dem i bulk, och ännu bättre, det ger dig verklig feedback om vad som lyckades och vad som misslyckades.

Följande bulkinsert API-operation kommer att infogas i newcollection den önskade datastrukturen där de nya dokumenten skapas inom produktinsamlingsmarkörens forEach() loop, med parentesnotation att skapa nya fastigheter. I bulkinfogningen kommer du att skicka operationerna till servern i omgångar om 1000, vilket ger dig bättre prestanda eftersom du inte skickar varje begäran till servern, bara en gång av 1000 förfrågningar:

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 exemplet ovan skulle feedbacken du får från bulk-API-operationen vara i detta format:

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

Frågar efter den nya samlingen db.newcollection.find() kommer att ge:

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

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



  1. Fixa "indexnamn måste vara en sträng" när du släpper flera index i MongoDB

  2. MongoDB - undkomma citattecken medan posten infogas

  3. Det gick inte att ansluta till server 127.0.0.1:27017

  4. Hur man skapar ett index med ett specifikt namn i MongoDB