Mongoose. Как в одной коллекции отобразить количество совпадений из другой коллекции

Друзья, добрый день!

Изучаю MongoDB и сейчас столкнулся с такой проблемой:

Есть БД в которой хранятся отдельно посты и отдельно комментарии.

Схема постов:

const PostSchema = new mongoose.Schema(
  {
    title: {
      type: String,
      required: true,
    },
    text: {
      type: String,
      required: true,
    },
    tags: {
      type: Array,
      default: [],
    },
    viewsCount: {
      type: Number,
      default: 0,
    },
    commentsCount: {
      // Счетчик совпадений по _id поста.
    },
    imageUrl: String,
    user: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true,
    },
  },
  {
    timestamps: true,
  }
);

export default mongoose.model("Post", PostSchema);

схема комментариев:

const CommentSchema = new mongoose.Schema(
  {
    text: {
      type: String,
      required: true,
    },
    user: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true,
    },
    post: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post",
      required: true,
    },
  },
  {
    timestamps: true,
  }
);

Мне нужно чтобы в модели поста в поле commentsCount отображать количество комментариев с его _id.


Ответы (1 шт):

Автор решения: Dmitriy Grape

Адекватно за один запрос — никак. Даже агрегацией. Комментарии к посту нужно получать отдельным запросом на сервер.

const response = {
   comments: await CommentModel.find({ post: new ObjectId(postId) }).skip(offset).limit(limit).exec(),
   count: await CommentModel.countDocuments({ post: new ObjectId(postId) }).exec()
}

А как адекватно прикрепить количество комментариев к посту при запросе всех постов, я, честно говоря, не знаю. Ведь вам придётся делать $lookUp для всех комментариев каждого из постов, коих (комментариев) может быть очень много.

→ Ссылка