Использование постного мангуста после сохранения - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я пытаюсь добавить ключ к возвращенному post.Но я не могу заставить lean() работать.Как я могу манипулировать возвращаемым сообщением после сохранения?

Я думал, может быть, мне нужно добавить Lean к моему findById, как это Post.findById(req.params.id).lean().then().Но это не сработало, плюс это только делает первый первый пост изменчивым.Он скажет

post.save не является функцией

, если я сделаю это также как Post.findById(req.params.id).lean().then()

Я хочу только вернутьобъект собирается быть отправленным обратно клиенту, я не хочу, чтобы они сохраняли ключ в фактическом документе.

 Post.findById(req.params.id)
      .then(post => {
        if (
          post.likes.filter(like => like.user.toString() === req.user.id)
            .length === 0
        ) {
          return res
            .status(400)
            .json({ notliked: "You have not yet liked this post" });
        }

        // Get remove index
        const removeIndex = post.likes
          .map(item => item.user.toString())
          .indexOf(req.user.id);

        // Splice out of array
        post.likes.splice(removeIndex, 1);

        // Save
        post.save().then(post => {  
          post["liked"] = false;  <-------
          res.json(post);
        });
      })

edit

  Post.findById(req.params.id)
      .lean()
      .then(post => {
        if (
          post.likes.filter(like => like.user.toString() === req.user.id)
            .length === 0
        ) {
          return res
            .status(400)
            .json({ notliked: "You have not yet liked this post" });
        }

        // Get remove index
        const removeIndex = post.likes
          .map(item => item.user.toString())
          .indexOf(req.user.id);

        // Splice out of array
        post.likes.splice(removeIndex, 1);
        post["liked"] = false;
        res.json(post);
        // Save
        post.save();
      })

выдает ошибку

post.save не является функцией

1 Ответ

0 голосов
/ 10 февраля 2019

Вы можете просто сделать это, выполнив поиск req.user.id внутри массива indexOf likes

Post.findOne({ _id: req.params.id }).lean().then((post) => {
  if (post.likes.indexOf(req.user.id) !== -1) {
    post.isLiked = true
  }
  post.isLiked = false
  res.json(post)
})

Гораздо лучше с агрегацией

Post.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(req.user.id) }},
  { "$addFields": {
    "isLiked": { "$in": [mongoose.Types.ObjectId(req.user.id), "$likes"] }
  }}
])

РЕДАКТИРОВАТЬ: - Если вы хотите обновить документ, используйте запрос на обновление

Post.findOneAndUpdate(
  { _id: req.params.id },
  { $pull: { likes: { user: req.user.id } }},
  { new: true }
).then((post) => {
  res.json(post)
})

Опубликовать схему для лайков

...
    likes: [
        {
          user: {
            type: Schema.Types.ObjectId,
            ref: "users"
          }
        }
      ]
...
...