Провайдер
Провайдер репозиторію MongoDB надає широкий перелік методів для побудови взаємодії з документами та колекціями в базі
даних MongoDB
.
create
Офіційна документація метода mongoose
- create
Метод create()
моделі mongoose
дозволяє створювати нові документи у колекції бази даних на основі переданого об'єкта
або масиву об'єктів. Після створення документів, метод повертає обіцянку, що дозволяє асинхронно обробляти результати.
Структура
import mongoose from "mongoose"
export type Docs<TRawDocType, DocContents = AnyKeys<TRawDocType>> = Array<
TRawDocType | DocContents
>;
export type SaveOptions = mongoose.SaveOptions;
export type AnyKeys<T> = mongoose.AnyKeys<T>;
type Create<TRawDocType> = (
model: string,
docs: Docs<TRawDocType>,
options?: SaveOptions
) => Promise<AnyKeys<TRawDocType>>;
де:
- Тип функції: Асинхронна.
- Типи:
TRawDocType
- Стру ктура моделі колекціїMongoDB
.Docs
- Документ або масив документів, які будуть створені, та які складаються з полів структуриTRawDocType
.SaveOptions
- опції збереження документа в колекціїMongoDB
.AnyKeys
- перелік ключів з структури моделі колекціїMongoDB
.
- Аргументи:
- Назва моделі колекції (обовʼязково).
- Обʼєкт документа або масив обʼєктів документів, які будуть створені (обовʼязково).
- Опції збереження запису (опціонально).
- Результат:
- Масив гідратованих документів (
THydratedDocumentType
), які були створені.
- Масив гідратованих документів (
Гідратований документ - це документ, який пройшов обробку та валідацію бібліотекою mongoose
, і може містити додаткові
властивості або оброблені дані.
Реалізація
import { setMongoRepository } from '@x-fiber/proton';
import type { Provider, Agents } from '@x-fiber/proton';
type User = { name: string; surname: string, id: string }
type Repository = {
create: (data: User) => Promise<void>
}
export const BusUsersAggMongoRepository = setMongoRepository<User, Repository>({
create: async (p: Provider, agents: Agents, data: User): Promise<void> => {
try {
await p.create(data);
} catch (error) {
console.error("Error:", error);
throw error;
}
},
});
insertMany
Посилання на офіційну
документацію mongoose
- insertMany
Метод insertMany()
моделі mongoose
призначений для вставки кількох документів одночасно у колекцію бази даних. Він
приймає масив об'єктів як аргумент та вставляє всі ці об'єкти в колекцію. Після вставки документів метод повертає
обіцянку для асинхронної обробки результатів.
Структура
import mongoose from "mongoose"
type Docs<TRawDocType, DocContents = AnyKeys<TRawDocType>> = Array<
TRawDocType | DocContents
>;
type AnyKeys<T> = mongoose.AnyKeys<T>;
type InsertManyOptions = mongoose.InsertManyOptions
type InsertManyResult = InsertManyOptions & { lean: true };
type InsertMany<TRawDocType, DocContents = TRawDocType> = (
model: string,
docs: Docs<TRawDocType>,
options?: InsertManyOptions
) => Promise<InsertManyResult<TRawDocType>>;
де:
- Тип функції: Асинхронна.
- Типи:
TRawDocType
- cтруктура моделі колекціїMongoDB
.Docs
- документ або масив документів, які будуть створені, та які складаються з полів структуриTRawDocType
.InsertManyOptions
- опції для методу insertMany.AnyKeys
- Тип, що відображає усі можливі ключі об'єкта структури моделы колекціїTRawDocType
.InsertManyResult
- результат вставки документів у колекцію, який містить опції збереження та додаткові властивості.
- Аргументи:
- Назва моделі колекції (обовʼязково).
- Обʼєкт документа або масив обʼєктів документів, які будуть створені (обовʼязково).
- Опції збереження запису (опціонально).
- Результат:
- Об'єкт, що містить опції збережен ня та додаткові властивості, повернутий методом insertMany, з локальною
оптимізацією
lean
.
- Об'єкт, що містить опції збережен ня та додаткові властивості, повернутий методом insertMany, з локальною
оптимізацією
Опція lean
в методі insertMany
Mongoose є параметром, який вказує, що результат повинен бути повернутий у вигляді
простого JavaScript
об'єкта, а не об'єктів mongoose
. Використання lean
призводить до зниження використання пам'яті
та збільшення швидкодії операцій з базою даних, оскільки об'єкти mongoose
містять додаткову інформацію та методи,
які можуть займати більше пам'яті й часу обробки. Однак при використанні lean
втрачається підтримка властивостей та
методів mongoose
, які можуть бути корисні для подальшої обробки даних. Тому використання опції lean
варто
враховувати з урахуванням конкретних вимог та обмежень проєкту.
Реалізація
import { setMongoRepository } from '@x-fiber/proton';
import type { Provider, Agents } from '@x-fiber/proton';
type User = { name: string; surname: string, id: string }
type Repository = {
insertMany: (data: User) => Promise<void>
}
export const BusUsersAggMongoRepository = setMongoRepository<User, Repository>({
insertMany: async (p: Provider, agents: Agents, data: User): Promise<void> => {
try {
await p.insertMany(data);
} catch (error) {
console.error("Error:", error);
throw error;
}
},
});
Основна відмінність між create()
і insertMany()
полягає в тому, що перший призначений для створення окремого
документа або кількох документів у колекції, тоді як другий призначений для вставки декількох документів як одне ціле у колекцію.
aggregate
Посилання на офіційну
документацію mongoose
- aggregate
Цей метод використовується для виконання складних агрегаційних операцій в MongoDB
за допомогою mongoose
.
Він дозволяє об'єднувати, фільтрувати, групувати, обчислювати та перетворювати дані у різних колекціях за
допомогою різних операцій, таких як $match
, $group
, $project
та інші. Цей метод надає розширені можливості
для аналізу даних та отримання складних результатів, які не можна отримати за допомогою простого запиту find
.
Структура
Опис структури методу aggregate
знаходиться в активній розробці
Реалізація
import { setMongoRepository } from '@x-fiber/proton';
import type { Provider, Agents } from '@x-fiber/proton';
type Count = { status: string; amountField: number, limit: number }
type AggregateStructure = {
// ... structure description
}
type Repository = {
getCount: (data: Count) => Promise<AggregateStructure>
}
export const AccAccountingAggMongoRepository = setMongoRepository<Count, Repository>({
getCount: async (p: Provider, agents: Agents, data: Count): Promise<
AggregateStructure
> => {
try {
return await p.aggregate([
{
$match: {status: data.status}
},
{
$group: {
_id: '$category',
totalAmount: {$sum: '$' + data.amountField},
averageAmount: {$avg: '$' + data.amountField}
}
},
{
$sort: {totalAmount: -1}
},
{
$limit: data.limit
}
]);
} catch (error) {
console.error("Error:", error);
throw error;
}
},
});
де операції:
$match
- Використання поляstatus
з параметраdata
для фільтрації.$group
- Групування за полемcategory
.$sort
- Сортування результатів по загальній сумі у зворотньому порядку.$limit
- Використання поля limit з параметра data для обмеження кількості результатів.