猫鼬将多个项目添加到数据库 [英] Mongoose add multiple items to database

查看:60
本文介绍了猫鼬将多个项目添加到数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码有两个问题. 1)仅BeerObjects的最后一个元素保存到数据库中. 2)保存到数据库中的最后一个元素(n = beerObjects.length)有n个重复项.

I have two problems with this code. 1) Only the last element of beerObjects is saved to the database. 2) There are n duplicates of the last element (n = beerObjects.length) saved to the database.

function addBeersToDatabase(beerObjects) {
for (i = 0; i < beerObjects.length; i++) {
    console.log(beerObjects[i].beerId);
    var currentBeer = beerObjects[i];

    // check if beer is already in database
    Beer.findOne({'beerId': currentBeer.beerId}, function(err, beer){
        if (err) {
            handleError(err);
        }
        if (beer) {
            // beer is already in database
        }
        else {
            // add new beer to database
            console.log(currentBeer.beerId);
            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) {
                if (err) {
                    throw err;
                }
            });
        }
    });
}

}

我想遍历每种啤酒并将其信息保存到数据库中.我使用findOne来防止重复,但这是行不通的.第一个console.log()语句打印每个啤酒ID,但是第二个console.log()语句多次打印最后一个啤酒ID.

I want to loop through each beer and save its info to the database. I used findOne to prevent duplicates but this is not working. The first console.log() statement prints each beer id but the seconds console.log() statement prints just the last beer id multiple times.

推荐答案

此处的问题是在findOne回调中-您的beerId将始终设置为beerObjects中的最后一个啤酒,因为循环结束在您进行第一个回调之前-欢迎使用异步javascript.

The issue here is that in the findOne callback - your beerId will always be set to the last beer in beerObjects, because the loop finishes before you get to your first callback - welcome to asynchronous javascript.

对此的一种补救方法是将您的findOne代码包装在IFFE(立即调用函数表达式)中.该代码将在从beerObject移至下一个啤酒之前完成.

One remedy for this is to wrap your findOne code in an IFFE (Immediately Invoked Function Expression). This code will complete before moving on to the next beer from beerObject.

有关IFFE的更多信息

Here is some more info on IFFE

IFFE上的堆栈溢出

我快速浏览了代码,我相信这应该可以,但是您可能需要对内部代码进行一些调整...

I took a quick pass at the code, I believe this should work, but you may have to make some adjustments with the internal code...

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

这篇关于猫鼬将多个项目添加到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆