简体   繁体   中英

MongoDB/Mongoose $pull an Object in an Array where _id of the Object is matching

I have this Schema here

在此处输入图像描述

Consider the likedTours which is an Array of Objects (Tours) (ignore position 0). I want to pull any Objects where the _id of a Tour matches the critiria.

Adding a new Tour upon liking a tour is okay, but on unlike I don't know how to pull that item out.

Here is my function in the Controller in the Node.JS backend

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

This method looks for a tour and update it by pulling out the userID and decrement the likes count by -1. And then I try to find in the UserDB that tour in the likedTours and tried to pull but it doesn't not work like that.

Thanks in advance

you can update as

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM