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
}