I have a problem that I have not found a solution yet, I have a select in a procedure, I do a forEach in the result, inside that forEach I make another select in another procedure using the Ids as per the code below.
The problem is that at the time of bulk in mongo db for some reason the function done () is calling the bulk more than once, at some point done () is being called more than once.
var consultaSQL = function(){
console.time('sql');
sequelize.query('PRS_MONGO_PRODUTO;', { type: sequelize.QueryTypes.SELECT }).then(function(result){
console.log(result.length);
console.timeEnd('sql');
done = _.after(result.length, function () {
if(result.length > 0) {
var i = 1;
var bulk = Detalhe.collection.initializeOrderedBulkOp();
console.time('bulk');
result.forEach(function(p){
bulk.find({ produtoId: p.produtoId, clienteId: p.clienteId }).upsert().replaceOne(p);
});
console.timeEnd('bulk');
console.log('Quantidade Exec: ' + result.length);
console.time('exec');
bulk.execute(function (err, result) {
if(err) console.error(err);
console.timeEnd('exec');
console.log('##################### Inicia em 5 Segundos! #####################');
var teste = setTimeout(function () {
consultaSQL();
}, 5000);
});
}
else {
console.log('##################### Sem registros! #####################');
setTimeout(function () {
consultaSQL();
}, 30000);
}
});
if(result.length == 0) done();
result.forEach(function(p){
p.skus = [];
sequelize.query('PRS_PESQ_PRODUTO_INDEXACAO_MONGO ' + p.clienteId + ', ' + p.produtoId, { type: sequelize.QueryTypes.SELECT }).then(function(resultA){
done2 = _.after(resultA.length, function () {
done();
});
if(resultA.length == 0) done2();
resultA.forEach(function(s){
sequelize.query('select caminho as imagem from produtoSkuImagem where produtoSkuId = ' + s.produtoSkuId, { type: sequelize.QueryTypes.SELECT }).then(function(resultB){
done3 = _.after(resultB.length, function () {
done2();
});
s.imagens = [];
s.imagens.push(resultB)
p.skus.push(s);
done3();
});
});
});
});
}).catch(function(err){
console.error(err);
process.exit();
});
}
The result he has to generate is this below:
{
"_id" : ObjectId("573b202f6d16e35c707c3119"),
"clienteId" : 1,
"produtoId" : 3948,
"parceiroId" : 1,
"codigoProduto" : "2014526",
"nome" : "Armário Blumenau Branco - Politorno",
"descricao" : "Armário para Forno Microondas, com duas portas.Fabricado em chapas de 15mm. Limpeza do móvel deve ser feita com um pano umedecido com água.",
"codigoMarca" : 3150,
"marca" : "Politorno",
"produtoSkuId" : 4424,
"peso" : 23250,
"altura" : 11,
"comprimento" : 109,
"estoque" : 1,
"preco" : 185.31,
"precoDe" : 285,
"pontos" : 195,
"parcelamento" : 1,
"imagem" : "https://static.wmobjects.com.br/imgres/arquivos/ids/2509026",
"ativo" : 1,
"dataCadastro" : ISODate("2016-03-21T11:10:53.620Z"),
"dataAtualizacao" : ISODate("2016-05-17T10:29:27.590Z"),
"skus" : [
{
"clienteId" : 1,
"produtoId" : 3948,
"parceiroId" : 1,
"codigoProduto" : "2014526",
"nome" : "Armário Blumenau Branco - Politorno",
"descricao" : "Armário para Forno Microondas, com duas portas.Fabricado em chapas de 15mm. Limpeza do móvel deve ser feita com um pano umedecido com água.",
"codigoMarca" : 3150,
"marca" : "Politorno",
"produtoSkuId" : 4424,
"peso" : 23250,
"altura" : 11,
"comprimento" : 109,
"estoque" : 1,
"preco" : 185.31,
"precoDe" : 285,
"pontos" : 195,
"parcelamento" : 1,
"imagem" : "https://static.wmobjects.com.br/imgres/arquivos/ids/2509026",
"ativo" : 1,
"dataCadastro" : ISODate("2016-03-21T11:10:53.620Z"),
"dataAtualizacao" : ISODate("2016-05-17T10:29:27.590Z"),
"imagens" : [
[
{
"imagem" : "https://static.wmobjects.com.br/imgres/arquivos/ids/2514797"
},
{
"imagem" : "https://static.wmobjects.com.br/imgres/arquivos/ids/2514804"
},
{
"imagem" : "https://static.wmobjects.com.br/imgres/arquivos/ids/2514811"
}
]
]
}
]
}
This code works the problem is that it calls the bulk more than once so it is inserted more than once, so the result is time consuming. I need done () to be called only once and right.