Nodejs / Mon goose pull objectId из массива не работает в тернарном выражении - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь сделать простую вещь, извлекая идентификатор пользователя из массива с базой данных mon goose on mon go и обновляя объект методом findByIdAndUpdate. здесь я использую методы $ pull '$ addToSet', такие как переключатель, для добавления и удаления userId из массива. Короче говоря, моя цель - понравиться при нажатии и в отличие от второго щелчка. поэтому я поместил '$ pull' и '$ addToSet' в тройное выражение и использовал его в методе findByIdAndUpdate () следующим образом:

exports.getLikeCounts = async (req, res) => {

  const likes = Review({_id: req.params.id}).likes.map(obj => obj.toString());

  //ternarry expression

  const likeOperator = likes.includes(req.user._id) ? '$pull' : '$addToSet';

  const likeReview = await Review
    .findByIdAndUpdate( {_id: req.params.id},
      {[likeOperator]: {likes: req.user._id}},
      {new: true}
    )
  res.json(likeReview);
}

Здесь он только добавляет, но не извлекает идентификатор пользователя из массив при втором щелчке. Я не могу понять, чего не хватает, любая помощь будет оценена и спасибо.

структура моей модели выглядит так:

likes:[
    { type: mongoose.Schema.ObjectId, ref: 'User'}
  ]

NB: если я использую pull и addtoset напрямую вот так: {'$ pull' или '$ addToSet': {like: req.user._id}} для теста он работает, но в тернарном выражении, подобном тому, как я использовал выше, не работают оба, а работает только addtoset.

1 Ответ

0 голосов
/ 09 мая 2020

Когда вы получаете лайки, вы должны получать их из базы данных с помощью Review.findById(), а не только Review()

const { likes } = await Review.findById(req.params.id);

const likeOperator = likes.includes(req.user._id) ? '$pull' : '$addToSet'; // this is fine already

const likeReview = await Review
  .findByIdAndUpdate(req.params.id, // this accepts _id
    { [likeOperator]: { likes: req.user._id } },
    { new: true }
  )
  res.json(likeReview);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...