MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose fügt der Datenbank mehrere Elemente hinzu

Das Problem hier ist das in findOne Rückruf - Ihre beerId wird immer auf das letzte Bier in beerObjects gesetzt , weil die Schleife endet, bevor Sie zu Ihrem ersten Callback kommen - willkommen bei asynchronem Javascript.

Abhilfe schafft hier das Wrappen von findOne Code in einem IFFE (Immediately Invoked Function Expression). Dieser Code wird vervollständigt, bevor mit dem nächsten Bier von beerObject fortgefahren wird.

Hier finden Sie weitere Informationen zu IFFE

Stapelüberlauf auf IFFE

Ich habe mir den Code kurz angesehen, ich glaube, das sollte funktionieren, aber Sie müssen möglicherweise einige Anpassungen am internen Code vornehmen ...

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);
}