sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb foreach para colección anidada para actualizar/copiar documentos a otra colección

Si va a actualizar toda la colección, entonces el limit en su cursor en su código actual no es necesario. El error que está recibiendo se debe a que mappingData campo en los products la colección no tiene un campo de subdocumento llamado array . De su ejemplo en la pregunta, solo el title el campo del subdocumento está disponible, y ese es el que desea.

Dependiendo del tamaño de la colección de productos, insertar los documentos convertidos en una nueva colección puede afectar sus operaciones. Puede evitar el rendimiento de inserción lento utilizando el nuevo API de inserción masiva que agiliza sus operaciones de inserción enviándolas de forma masiva y, lo que es mejor, le proporciona información real sobre lo que tuvo éxito y lo que falló.

La siguiente operación API de inserción masiva se insertará en newcollection la estructura de datos deseada donde se crean los nuevos documentos dentro del cursor de la colección de productos forEach() bucle, usando la notación de paréntesis para crear nuevas propiedades. En la inserción masiva, enviará las operaciones al servidor en lotes de 1000, lo que le brinda un mejor rendimiento ya que no envía todas las solicitudes al servidor, solo una de cada 1000 solicitudes:

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 el ejemplo anterior, los comentarios que recibe de la operación de API masiva tendrían este formato:

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

Consultando la nueva colección db.newcollection.find() producirá:

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

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