Javascript Nodejs/Mongoose将变量传递给Mongoose函数

Javascript Nodejs/Mongoose将变量传递给Mongoose函数,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我不熟悉Node.js和Mongoose,需要一些帮助。所以我首先创建一个名为beerObjects的数组。然后我向breweryDB发出请求,并将信息存储在此数组中 request(options, function (error, response, body) { if (error) throw new Error(error); obj = JSON.parse(body); data = obj['data'];

我不熟悉Node.js和Mongoose,需要一些帮助。所以我首先创建一个名为beerObjects的数组。然后我向breweryDB发出请求,并将信息存储在此数组中

request(options, function (error, response, body) {
            if (error) throw new Error(error);
            obj = JSON.parse(body);
            data = obj['data'];
            for(i = 0; i < data.length; i++) {
                var newBeer = new Beer();
                newBeer.id = data[i]['id'];
                newBeer.name = data[i]['name'];
                newBeer.description = data[i]['description'];
                newBeer.abv = data[i]['abv'];
                if (data[i].hasOwnProperty('labels')) {
                    newBeer.image = data[i]['labels']['large'];
                }

                beerObjects.push(newBeer);
                console.log(beerObjects[i].name);
            }
            addBeersToDatabase(beerObjects);
        });
此“id”是beerObjects[i]的id,而不是newBeer。如何正确地将beerObjects传递给mongoose函数并在该函数中使用它

编辑:

}


此代码仅添加了beerObjects中最后一项的n个重复项(其中n=beerObjects.length)。

您需要使用_id而不是id:

newBeer._id = data[i]['id'];
newBeer.name = data[i]['name'];
编辑:

您正在使用
beerObject[i].id来循环并“抓取”啤酒,然后异步检查计数,当您开始设置newBeer.id时,您处于不同的范围内。解决方法是将变量设置为
beerObject[i].id
,并将其作为在
beer.count中查找的“beer”传入:

像这样:

for (i = 0; i < beerObjects.length; i++) {
    console.log(beerObjects[i].id);
    var checkBeer = beerObjects[i]
    // check if beer is already in database
    Beer.count({id: checkBeer.id}, function(err, count){
        if (err) {
            handleError(err);
        }
        if (count == 0) {
            // add new beer to database
            var newBeer = new Beer();
            newBeer.id = checkBeer.id;
... and so on
for(i=0;i
MongoDB ID是自动生成的,因此除非您在mongoose模型中将
\u ID
定义为字符串,否则无法将任何值添加到
\u ID
属性中

比如说

var mongoose = require('mongoose');
var beerSchema = new mongoose.Schema({
    _id: String,
    name: String,
    // rest of beer properties
});

module.exports = mongoose.model('Beer', beerSchema);
在你的职能范围内

function addBeersToDatabase(beerObjects) {
    for (i = 0; i < beerObjects.length; i++) {
    Beer.findbyId(beerObjects[i].id, function(err, beers){
        if (beers.lenght == 0) {
            // add new beer to database
            var newBeer = new Beer();
            newBeer._id = beerObjects[i].id;
            newBeer.name = beerObjects[i].name;
            newBeer.description = beerObjects[i].description;
            newBeer.abv = beerObjects[i].abv;
            newBeer.image = beerObjects[i].image;
            newBeer.save();
        }
        else {
            // beer is already in database
        }
    });
}
函数addBeersToDatabase(beerObjects){
对于(i=0;i

如果要使用默认mongoId,只需删除model和newBeer中的
\u id:String
。\u id=beerObjects[i]id
来自函数。我希望这会对您有所帮助。

I
变量的定义超出了范围,您应该使用本地变量或将
id
存储在函数local var:
var id=beerObjects[I]中.id;
仍然不起作用。我创建了一个名为“id”的字段,它是啤酒的id。“\u id”是不同的,那是mongodb id。所以这不是newBeer的问题,这是beerObjects的问题。与其他答案相同。仍然不起作用。我创建了一个名为“id”的字段,它是啤酒的id。“\u id”不同,那是mongodb id。所以这不是newBeer的问题,这是beerObjects的问题。是的,这解决了我原来的问题,但现在我有另一个问题。只有列表中的最后一个啤酒被添加到我的数据库中。假设列表长度为10。它将相同啤酒的10个副本添加到数据库中。我现在使用findOne,但它仍然不起作用。我甚至尝试过匹配名称而不是id,但它仍在添加重复项。并且for循环仍在使用最后一瓶啤酒循环数次。是的,我将其放入了一个新函数中。请查看编辑后的问题。
newBeer._id = data[i]['id'];
newBeer.name = data[i]['name'];
for (i = 0; i < beerObjects.length; i++) {
    console.log(beerObjects[i].id);
    var checkBeer = beerObjects[i]
    // check if beer is already in database
    Beer.count({id: checkBeer.id}, function(err, count){
        if (err) {
            handleError(err);
        }
        if (count == 0) {
            // add new beer to database
            var newBeer = new Beer();
            newBeer.id = checkBeer.id;
... and so on
var mongoose = require('mongoose');
var beerSchema = new mongoose.Schema({
    _id: String,
    name: String,
    // rest of beer properties
});

module.exports = mongoose.model('Beer', beerSchema);
function addBeersToDatabase(beerObjects) {
    for (i = 0; i < beerObjects.length; i++) {
    Beer.findbyId(beerObjects[i].id, function(err, beers){
        if (beers.lenght == 0) {
            // add new beer to database
            var newBeer = new Beer();
            newBeer._id = beerObjects[i].id;
            newBeer.name = beerObjects[i].name;
            newBeer.description = beerObjects[i].description;
            newBeer.abv = beerObjects[i].abv;
            newBeer.image = beerObjects[i].image;
            newBeer.save();
        }
        else {
            // beer is already in database
        }
    });
}