Node.js 从Mongoose中的两个集合创建和链接条目

Node.js 从Mongoose中的两个集合创建和链接条目,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有两个收藏:食谱和配料。我希望能够在配方条目中保存配料id 当用户创建食谱时,他们会提供一系列配料: "ingredients": [ { "ingredient": "full cream milk", "quantity": "4 cups (1L)" }, { "ingredient": "elbow macaroni", "quantity": "2 cups" }, {

我有两个收藏:食谱和配料。我希望能够在配方条目中保存配料id

当用户创建食谱时,他们会提供一系列配料:

    "ingredients": [
    {
        "ingredient": "full cream milk",
        "quantity": "4 cups (1L)"
    },
    {
        "ingredient": "elbow macaroni",
        "quantity": "2 cups"

    },
    {
        "ingredient": "cheddar cheese",
        "qualifier": "grated",
        "quantity": "2 cups"

    }
]
然后,在保存配方之前,我们将遍历此数组中的每个对象,并使用配料中的给定名称创建配料(如果它不存在):

if(req.body.ingredients != undefined){
    var ingredientsArr = req.body.ingredients;
    for(i=0;i<ingredientsArr.length;i++){
        Ingredient.update({"name":new RegExp(ingredientsArr[i].ingredient,"i")},{$setOnInsert:{"name":ingredientsArr[i].ingredient}},{upsert:true},function(err,ingredients){
            if(err){ return next(err) }
        })
    }
}
但是,我遇到了范围问题,无法访问
findOne()
回调函数外部的
id
,也无法从内部访问
ingredientsar
。我确信我在这里遗漏了一些明显的东西,但当我试图用谷歌搜索我的问题时,我找不到任何帮助。

if(req.body.components!=未定义){
var IngreditSarr=所需的主体成分;
IngCreditsarr.forEach((项目,i)=>{
芬顿先生({
“名称”:项目.成分
},功能(错误,成分){
如果(错误){
返回下一个(错误)
}否则{
//你是说这个吗?
item.Component=成分。\u id
//或ingredientsArr[i]。成分=成分。\u id?
}
})

})
D'oh!是的,因为for循环不像forEach()那样是异步的,对吗?工作起来很有吸引力。如果你想使用这些数据,你必须等待所有回调完成,你可以标记并签入每个回调,但我建议使用promise,请参阅
Ingredient.findOne({"name":new RegExp(ingredientsArr[i].ingredient,"i")},function(err, ingredient){
            var id = ingredient._id
})