Используйте $ inc с $ addToSet в mongodb

1

У меня есть простая функция для сообщений LIKE, на бэкэнде этого веб-приложения.

Я использую .findByIdAndUpdate для применения двух изменений:

  • Нажмите user_id в массив post _liked_by.

  • Измените свойство likes_count чтобы отразить обновление.

Я использую модификатор $addToSet, чтобы нажать user_id на массив post _liked_by чтобы избежать user_id дважды.

Но если я просто увеличиваю значение likes_count, функция фактически увеличит его, даже если user_id уже присутствует в массиве _liked_by и массив остался с тем же размером.

Есть ли способ передать _liked_by массива _liked_by элегантным способом как значение свойства likes_count?

Вот код:

Post.findByIdAndUpdate({
    _id: post_id
  }, {
    $addToSet: {
      _liked_by: user_id
    },
    // I'd like to have something like...
    $set: {
      likes_count: _liked_by.length
      // ...as If it reads the actual length after the previous $addToSet
      //  Is there an option to do something similar?
    }
  }, {
    new: true
  })
  .then((updated_post) => {
    res.status(200).json({
      message: "Post has been liked Successflly!",
      post: updated_post
    });
  })
  .catch((err) => {
    res.status(500).json({
      message: "something went wrong | internal server error ",
      err
    });
  });
};
Теги:
mongoose

1 ответ

1

Отфильтруйте массив _liked_by в части запроса фильтра (запроса), а не с помощью $addToSet а затем вы можете использовать $inc здесь для увеличения массива _liked_by на 1

Post.findByIdAndUpdate(
  { "_id": post_id, "_liked_by": { "$ne": user_id } },
  {
    "$addToSet": { "_liked_by": user_id },
    "$inc": { "likes_count": 1 }
  },
  { "new": true }
)

И вы также можете использовать $push потому что мы делаем фильтрацию в части запроса

Post.findByIdAndUpdate(
  { "_id": post_id, "_liked_by": { "$ne": user_id } },
  {
    "$push": { "_liked_by": user_id },
    "$inc": { "likes_count": 1 }
  },
  { "new": true }
)
  • 1
    Это хорошая стратегия, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню