MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoose aggiunge più elementi al database

Il problema qui è che nel findOne richiamata - il tuo beerId sarà sempre impostato sull'ultima birra in beerObjects , perché il ciclo termina prima di arrivare alla prima richiamata:benvenuto in javascript asincrono.

Un rimedio per questo è avvolgere il tuo findOne codice in un IFFE (Immediately Invoked Function Expression). Questo codice verrà completato prima di passare alla birra successiva da beerObject.

Ecco qualche informazione in più su IFFE

Stack Overflow su IFFE

Ho fatto un rapido passaggio al codice, credo che dovrebbe funzionare, ma potresti dover apportare alcune modifiche con il codice 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);
}