【问题标题】:mongodb/mongoose findOneandUpdate how to get index and delete objectmongodb/mongoose findOneandUpdate 如何获取索引和删除对象
【发布时间】:2018-12-30 03:38:40
【问题描述】:

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

我的架构与此类似:

  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'
          }
        }
      ]
    }
  ]
}

而我当前对 cme​​ts 的添加喜欢功能如下所示:

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

【问题讨论】:

  • 也许您可以将喜欢的内容保存为 user_id,并且每当有人不喜欢时,都会返回该 user_id 的新过滤数组。我认为它可能更简单
  • 你能跟进更多吗?我不确定我是否得到你
  • 如果您将喜欢的内容保存为简单的 user_id 数组,例如[1,2,3...],那么,假设用户在不喜欢时已登录,您可以过滤喜欢的数组,例如likesArray = likesArray.filter(id => user.id !== id),然后在找到该事件时,更新使用 $set{'comment.likes': likesArray} 。希望它有意义并有所帮助
  • 设法“使用拉操作员将其拉下”

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

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

【讨论】:

  • 酷,忘了$pull
猜你喜欢
  • 1970-01-01
  • 2016-11-19
  • 2014-10-16
  • 2019-09-30
  • 1970-01-01
  • 2016-03-30
  • 2020-03-10
  • 2021-05-17
相关资源
最近更新 更多