Node.js 如何仅向mongoose架构中的子文档数组添加唯一项--$addToSet

Node.js 如何仅向mongoose架构中的子文档数组添加唯一项--$addToSet,node.js,mongodb,Node.js,Mongodb,我正在构建一个应用程序来自学fullstack web开发。在我的应用程序中,每个用户都有一个recipebox,显示他们添加的食谱。如何确保仅向用户配方框添加唯一的条目?在过去的几个小时里,我一直在摸索$addToSet(这些文档帮不上什么忙),但它似乎不起作用。我倾向于使用mongoose提供的功能,因为我已经有了一个很长的函数使它工作 在我这里的插入操作中,配方被分配了唯一的ID,所以看起来它们总是被添加。如果这就是mongo所做的,那么我似乎需要在模式中添加一个“name”属性并进行检查

我正在构建一个应用程序来自学fullstack web开发。在我的应用程序中,每个用户都有一个recipebox,显示他们添加的食谱。如何确保仅向用户配方框添加唯一的条目?在过去的几个小时里,我一直在摸索$addToSet(这些文档帮不上什么忙),但它似乎不起作用。我倾向于使用mongoose提供的功能,因为我已经有了一个很长的函数使它工作

在我这里的插入操作中,配方被分配了唯一的ID,所以看起来它们总是被添加。如果这就是mongo所做的,那么我似乎需要在模式中添加一个“name”属性并进行检查,但我不确定。我不清楚被分配的ID是帮助还是伤害。。。。这是我的路由和DB插入操作。感谢您的指导。如何确保配方框中只添加唯一的条目?(done属性用于网站上的复选框,忽略:))。我已经包括了“填充”,因为最终我想返回实际的食谱,而不仅仅是它们的ID

app.post('/api/recipebox', function(req, res) {
    var recipe = new Recipe({
        recipeUrl: req.body.recipe.source.sourceRecipeUrl,
        image: req.body.recipe.images[0].hostedSmallUrl,
        numServings: req.body.recipe.numberOfServings,
        Ingredients: req.body.recipe.ingredientLines,
        NutritionalInformation: req.body.recipe.nutritionEstimates,
        name: req.body.recipe.name,
        totalTime: req.body.recipe.totalTime
    });

    var userId = req.user._id;
    var query = {
        _id: userId
    };
    var recipeId = recipe._id;

    recipe.save(function(err, recipe) {
        if(err) {
            throw err;
        }

        User.findByIdAndUpdate(userId, {
            $addToSet: {


                recipeBox: {
                    _id: recipeId,
                    name: req.body.recipe.name
                }
            }
        }).populate('recipeBox').exec(function(err, _user) {
            if(err) {
                throw err;
            }

            console.log(_user);
        });

    });
});
我检查了一下,var recipeId实际上等于第一次回调中的“recipe”参数,对于它为什么不起作用非常困惑——我是否遗漏了回调操作的某些内容

更新:

我试过这个,但也不起作用:

recipe.save(function (err, recipe) {
  if (err) {
    throw err;
  }
  console.log("SECOND PARAMETER RECIPE ID", recipe._id);
  User.findByIdAndUpdate(userId, {
    $addToSet: {
      recipeBox: recipeId
    }
  }).populate('recipeBox').exec(function (err, user) {
    console.log("ANOTHER PARAMETER", user);
    if (err) {
      throw err;
    }
    user.save();
    // broadCastStream();
  });
  // broadCastStream();
});
用户架构:

var userSchema = new Schema({
  email: {
    type: String,
    unique: true
  },
  password: String,
  resetPasswordToken: String,
  resetPasswordExpires: Date,
  picture: ObjectId,
  name: String,
  facebook: {
    id: String,
    token: String,
    pictures: String
  },

   recipeBox: [{_id: ObjectId, name: String, done: Boolean}]


});

尝试以下操作,而不是添加对象
$addToSet{recipeBox:recipeId}
请查看我的更新代码它不工作!好吧,您已经找到了原因-因为您使用的是两个不同的集合recipes和users,并且您总是添加到recipe集合中,它会获得一个唯一的id,这将始终添加到users集合中。如果您希望确保用户不能两次添加同一配方,那么您还需要一种机制来唯一地标识配方,可能是通过匹配recipeurl。