首页 > 解决方案 > MongoDB/Mongoose $pull 一个数组中的对象,其中对象的 _id 匹配

问题描述

我在这里有这个架构

在此处输入图像描述

考虑likedTours这是一个对象数组(旅游)(忽略位置 0)。我想拉出_id巡回赛符合标准的任何对象。

喜欢旅游时添加新的旅游是可以的,但不像我不知道如何把那个项目拉出来。

这是我在 Node.JS 后端的控制器中的函数

const unlikeTour = async (req, res) => {
   try {
      TourDB.Tour.findOneAndUpdate(
         { _id: req.params.tourid },
         {
            $pull: { likedUsers: req.userID },
            $inc: { likes: -1 },
         }
      ).exec(async (err, docs) => {
         if (!err) {
            try {
               await UserDB.User.findOneAndUpdate(
                  { _id: req.userID },
                  { $pull: { 'likedTours._id': docs._id } } //Here I need help
               ).exec()
               return res.status(200).send({ successMessage: 'Tour successfully unliked' })
            } catch (err) {
               return res.status(500).send({ errorMessage: 'User not found' })
            }
         } else {
            return res.status(500).send({ errorMessage: 'Tour not found' })
         }
      })
   } catch (err) {
      return res.status(500).send({ errorMessage: err })
   }
}

此方法查找游览并通过提取用户 ID 并将喜欢计数减少 -1 来更新它。然后我尝试在 UserDB 中找到巡回演出likedTours并尝试拉动,但它不能那样工作。

提前致谢

标签: javascriptnode.jsdatabasemongodbmongoose

解决方案


你可以更新为

await UserDB.User.findOneAndUpdate(
  { _id: req.userID },
  { $pull: { likedTours: { _id: docs._id } } } //Here I need help
).exec();

参考:https ://docs.mongodb.com/manual/reference/operator/update/pull/


推荐阅读