mongoose在数组中搜索userid,如果找到,则将其与重复项一起删除。怎么样?

时间:2017-11-21 18:44:12

标签: javascript node.js mongodb mongoose

所以有人点击了类似的按钮。它将在下面调用此函数。我需要它不要推动同一个用户两次。此外,如果再次按下like按钮,它将表现为不喜欢或删除,所以它应该从这个喜欢的数组中删除用户。我怎么做?这就是我到目前为止所拥有的

chapterController.likeChapter = function (req, res) {
    var userId = req.body.by;
    var chapterId = req.body.chapterId;



        Chapter.findOne({
      _id: chapterId


    }, function(err, chap){

      if(chap.likes.indexOf(userId) !== -1){
          chap.likes.pull(userId);

      }else{
        chap.likes.addToSet(userId);
      }
        chap.save();
    })





      Chapter.findByIdAndUpdate(chapterId, {
      $push: {
        likes: userId
      }
     }, {}, function(err, obj) {
      if (err) {
        console.log(err);
      } else {
        Chapter.find({_id: chapterId}).then(function (chapter) {
            var chapter = chapter;
            Comment.find({chapterId: chapterId}).then(function(data){
                return res.send({ commentList : data, user: req.user, chapter: chapter});
                //console.log(chapter);
            });

         })

      }
    });
  };

更新:到目前为止,它完成了我发布的大部分内容。我需要它来删除所有重复项。不只是一个。

2 个答案:

答案 0 :(得分:0)

我不完全知道您的数据模型,但在Chapter.findByIdAndUpdate的回调中,您可以像这样映射用户ID;

obj.userid.map((userIdFromDb) => {
 if(userIdFromDb !== userId) {
    do something...
  }
})

但我强烈建议你,如果你有时间增长的数据,不要使用mongodb。在这种情况下,您可以使用关系数据库,mongo将为您保存静态。

答案 1 :(得分:0)

  

我需要它不要两次推送同一个用户。

使用$addToSet代替$push

Chapter.findByIdAndUpdate(chapterId, {
  $addToSet: {
    likes: userId
  }
 }, ...
  

此外,如果再次按下“喜欢”按钮,它会像不喜欢或删除一样,所以它应该从这个喜欢的数组中删除用户。

$push案例的更新中使用$pull运算符:

Chapter.findByIdAndUpdate(chapterId, {
  $pull: {
    likes: userId
  }
 } ...