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

Mongodb foreach per la raccolta nidificata per aggiornare/copiare documenti in un'altra raccolta

Se hai intenzione di aggiornare l'intera collezione, allora il limit sul cursore nel codice corrente non è necessario. L'errore che ricevi è dovuto a mappingData campo nel products la raccolta non ha un campo del documento secondario chiamato array . Dal tuo esempio nella domanda, solo il title il campo del documento secondario è disponibile ed è quello che desideri.

A seconda delle dimensioni della collezione di prodotti, l'inserimento dei documenti convertiti in una nuova collezione potrebbe influire sulle tue operazioni. È possibile evitare prestazioni di inserimento lente utilizzando il nuovo API di inserimento collettivo che semplifica le tue operazioni di inserimento inviandole in blocco e, ancora meglio, ti dà un feedback reale su ciò che è riuscito e ciò che ha fallito.

La seguente operazione API di inserimento collettivo verrà inserita in newcollection la struttura dati desiderata in cui vengono creati i nuovi documenti all'interno del cursore di raccolta prodotti forEach() loop, utilizzando la notazione parentesi per creare nuove proprietà. Nell'inserimento collettivo, invierai le operazioni al server in batch di 1000, il che ti offre prestazioni migliori poiché non invierai tutte le richieste al server, solo una volta ogni 1000 richieste:

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

Con l'esempio sopra, il feedback che ricevi dall'operazione API in blocco sarebbe in questo formato:

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

Interrogazione della nuova raccolta db.newcollection.find() produrrà:

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

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