首页 > 解决方案 > mongodb/mongoose findOneandUpdate 如何获取索引和删除对象

问题描述

所以我有事件对象,它有评论,评论有喜欢数组。我目前可以做的是将喜欢添加到事件对象的评论数组中。

我的架构与此类似:

  creator: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  comments: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: 'User'
      },
      text: {
        type: String,
        required: true
      },
      likes: [
        {
          user: {
            type: Schema.Types.ObjectId,
            ref: 'User'
          }
        }
      ]
    }
  ]
}

我当前的添加评论功能如下所示:

  commentLike: async (req, res) => {
    console.log('working', req.params.id, req.params.idas, req.params.commentID);
    Events.findOneAndUpdate(
      { _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
      { $push: { 'comments.$.likes': { user: req.params.id } } },
      (result) => {
        res.json(result);
      }
    );
  }

参数:idas-event._id,commentID:评论 id,id:user._id

问题是我可以添加无尽的喜欢,因为我没有逻辑操作来检查用户是否已经喜欢它,而且我真的很挣扎,在这个 findoneandupdate 函数中做到这一点。但这就是问题所在,我想做的另一件事与评论不同,我很难弄清楚如何从喜欢数组中获取用户索引,以便我可以切出该索引,目前我的函数看起来像这样:

  deleteLike: async (req, res) => {
    console.log('working', req.params.id, req.params.idas, req.params.commentID);
    Events.findOneAndUpdate(
      { _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
      {
        $push: {
          'comments.$.likes': {
            $each: [],
            $slice: 0 //there instead of 0 should be user index
          }
        }
      },
      (result) => {
        res.json(result);
      }
    );
  }

在这个函数上我也使用 findoneandupdate 函数,这可能不是一个好主意?试图使用 findandremove,但它删除了整个事件对象。

标签: javascriptnode.jsmongodbmongoose

解决方案


所以我设法通过使用拉操作符来做到这一点。工作删除评论之类的功能

  deleteLike: async (req, res) => {
    console.log('working', req.params.id, req.params.idas, req.params.commentID);
    Events.findOneAndUpdate(
      { _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
      {
        $pull: { 'comments.$.likes': { user: req.params.id } }
      },
      (result) => {
        res.json(result);
      }
    );
  }
};

推荐阅读