mongodb / mongoose findOneandUpdate如何获取索引和删除对象

时间:2018-07-22 14:20:16

标签: javascript node.js mongodb mongoose

所以我有一个事件对象,该对象具有注释,而注释具有likes数组。 我目前可以做的是在事件对象的注释数组中添加类似内容。

我的架构与此类似:

  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函数中无法做到这一点。但这就是问题,我想做的另一件事是与评论不同,而林先生对于如何从Likes数组中获取用户索引以便于可以将其切出的内容搞不清,目前我的功能如下所示:

  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,但是它删除了整个事件对象。

1 个答案:

答案 0 :(得分:1)

因此,我通过使用pull运算符设法做到了。 工作删除评论,如功能

  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);
      }
    );
  }
};