MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb foreach para coleção aninhada para atualizar/copiar documentos para outra coleção


Se você for atualizar toda a coleção, o limit no seu cursor no seu código atual não é necessário. O erro que você está recebendo é porque o mappingData campo em products coleção não tem um campo de subdocumento chamado array . Do seu exemplo na pergunta, apenas o title campo de subdocumento está disponível, e esse é o que você deseja.

Dependendo do tamanho da coleção de produtos, inserir os documentos convertidos em uma nova coleção pode afetar suas operações. Você pode evitar um desempenho de inserção lento usando o novo API de inserção em massa que agiliza suas operações de inserção enviando-as em massa e, melhor ainda, fornece feedback real sobre o que foi bem-sucedido e o que falhou.

A seguinte operação da API de inserção em massa será inserida em newcollection a estrutura de dados desejada onde os novos documentos são criados dentro do cursor de coleção de produtos forEach() loop, usando a notação de colchetes para criar novas propriedades. Na inserção em massa, você enviará as operações para o servidor em lotes de 1.000, o que oferece um desempenho melhor, pois você não está enviando todas as solicitações ao servidor, apenas uma vez a cada 1.000 solicitações:
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(); }

Com o exemplo acima, o feedback que você recebe da operação da API em massa estaria neste formato:
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

Consultando a nova coleção db.newcollection.find() vai render:
/* 0 */
{
    "_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
    "title" : "Toshiba Satellite Pro 4600 PIII800",
    "Manufacturer" : "Toshiba"
}

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