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

时间:2017-01-24 07:28:56

标签: node.js mongodb express mongoose

我有两个系列:食谱和配料。我希望能够在配方条目中保存配料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) }
        })
    }
}

现在我需要做的是完成ingredientsArr并将每个ingredient:字段替换为相应的_id

我可以使用_id找到findOne()

Ingredient.findOne({"name":new RegExp(ingredientsArr[i].ingredient,"i")},function(err, ingredient){
            var id = ingredient._id
})

但是,我遇到了范围问题,我无法在id回调函数之外访问findOne(),而我无法从内部访问ingredientsArr。我确定我在这里遗漏了一些明显的东西,但当我试图谷歌解决我的问题时,我找不到任何帮助。

1 个答案:

答案 0 :(得分:1)

if (req.body.ingredients != undefined) {
  var ingredientsArr = req.body.ingredients;
  ingredientsArr.forEach((item,i) => {
    Ingredient.findOne({
      "name": item.ingredient
    }, function(err, ingredient) {
      if (err) {
        return next(err)
      }else{
        //do you mean this?
        item.ingredient = ingredient._id
        // or ingredientsArr[i].ingredient = ingredient._id ?
      }
    })
  })