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

Mongoose adiciona vários itens ao banco de dados


O problema aqui é que no findOne retorno de chamada - seu beerId será sempre definido para a última cerveja em beerObjects , porque o loop termina antes de você chegar ao seu primeiro retorno de chamada - bem-vindo ao javascript assíncrono.

Uma solução para isso é envolver seu findOne código em um IFFE (Expressão de Função Imediatamente Invocada). Este código será concluído antes de passar para a próxima cerveja de beerObject.

Aqui estão mais algumas informações sobre o IFFE

Stack Overflow em IFFE

Dei uma passada rápida no código, acredito que deve funcionar, mas talvez seja necessário fazer alguns ajustes com o código interno...
for(var i = 0; i < beerObjects.length; i++) {
    console.log(beerObjects[i].beerId);
    //var currentBeer = beerObjects[i]; dont need this now
    (function (currentBeer) {
        Beer.findOne({ beerId: currentBeer},
            function(err, beer) {
                if(!err && !beer) {
                    var newBeer  = new Beer();
                    newBeer.beerId = currentBeer.beerId;
                    newBeer.name = currentBeer.name;
                    newBeer.description = currentBeer.description;
                    newBeer.abv = currentBeer.abv;
                    newBeer.image = currentBeer.image;
                    newBeer.save(function(err) {
                       // log your error here...
                    });
                } else if(!err) {
                    console.log("Beer is in the system");
                } else {
                    console.log("ERROR: " + err);
                }
            }
        );   
    })(beerObjects[i].beerId);
}