Провайдер
Провайдер репозиторію 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 для обмеження кількості результатів.