Typegoose. Как в модели посчитать среднее значение по данным?

Typegoose - это библиотека TypeScript, которая позволяет писать классы моделей для MongoDB, используя декораторы и типизацию. Для подсчета среднего значения по данным в модели, вы можете воспользоваться агрегационными функциями MongoDB.

Для начала, у вас должны быть установлены и настроены TypeScript, MongoDB и Typegoose. Затем вам нужно создать класс модели, используя декораторы Typegoose, и добавить метод для подсчета среднего значения.

Пример кода:

import { prop, getModelForClass, ReturnModelType } from '@typegoose/typegoose';

class ExampleModel {
  @prop({ required: true })
  value: number;
}

const ExampleModelModel = getModelForClass(ExampleModel);

class ExampleService {
  private readonly exampleModel: ReturnModelType<typeof ExampleModel>;

  constructor() {
    this.exampleModel = ExampleModelModel;
  }

  async calculateAverageValue(): Promise<number> {
    const results = await this.exampleModel.aggregate([
      {
        $group: {
          _id: null,
          averageValue: { $avg: '$value' },
        },
      },
    ]);

    if (results.length === 0) {
      throw new Error('No data found');
    }

    return results[0].averageValue;
  }
}

const exampleService = new ExampleService();
exampleService.calculateAverageValue()
  .then(averageValue => {
    console.log('Average value:', averageValue);
  })
  .catch(error => {
    console.error('Error:', error);
  });

В этом примере мы создаем класс модели ExampleModel с одним полем value, представляющим числовое значение. Затем мы создаем класс ExampleService, который содержит метод calculateAverageValue(), выполняющий агрегацию MongoDB для подсчета среднего значения поля value в модели ExampleModel. Мы используем метод aggregate() для выполнения агрегационной функции $group с оператором $avg. Результаты запроса агрегации сохраняются в переменной results. Поскольку результат агрегации возвращается в виде массива объектов, мы проверяем, есть ли элементы в массиве и возвращаем найденное среднее значение.

Вы также можете настроить фильтры и сортировку агрегации MongoDB, добавив соответствующие этапы в массив агрегации. Например:

const results = await this.exampleModel.aggregate([
  { $match: { category: 'example' } }, // фильтрация по категории
  { $sort: { value: 1 } }, // сортировка по возрастанию значения
  {
    $group: {
      _id: null,
      averageValue: { $avg: '$value' },
    },
  },
]);

Проверьте документацию MongoDB и Typegoose для получения дополнительной информации о возможностях агрегационных функций и типов декораторов.