MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb foreach für verschachtelte Sammlungen zum Aktualisieren/Kopieren von Dokumenten in eine andere Sammlung

Wenn Sie die gesamte Sammlung aktualisieren, dann limit auf Ihrem Cursor in Ihrem aktuellen Code ist nicht erforderlich. Der Fehler, den Sie erhalten, liegt daran, dass mappingData Feld in den products Sammlung hat kein Filialdokumentfeld namens array . Aus Ihrem Beispiel in der Frage nur der title Unterdokumentfeld ist verfügbar, und das ist das gewünschte.

Je nach Größe der Produktsammlung kann sich das Einfügen der konvertierten Dokumente in eine neue Sammlung auf Ihren Betrieb auswirken. Sie können eine langsame Einfügeleistung vermeiden, indem Sie das neue ungeordnete Bulk-Insert-API das Ihre Einfügevorgänge rationalisiert, indem es sie in großen Mengen sendet, und noch besser, es gibt Ihnen echtes Feedback darüber, was erfolgreich war und was fehlgeschlagen ist.

Die folgende Bulk-Insert-API-Operation fügt in newcollection ein die gewünschte Datenstruktur, in der die neuen Dokumente im forEach() -Schleife unter Verwendung der Klammernnotation um neue Eigenschaften zu erstellen. Bei der Masseneinfügung senden Sie die Vorgänge in Stapeln von 1000 an den Server, wodurch Sie eine bessere Leistung erzielen, da Sie nicht jede Anfrage an den Server senden, sondern nur einmal alle 1000 Anfragen:

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

Mit dem obigen Beispiel hätte das Feedback, das Sie von der Massen-API-Operation erhalten, folgendes Format:

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

Abfrage der neuen Sammlung db.newcollection.find() ergibt:

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

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