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 для получения дополнительной информации о возможностях агрегационных функций и типов декораторов.