|
|
@@ -41,7 +41,7 @@ npm install @e22m4u/js-repository
|
|
|
| `memory` | Виртуальная база в памяти процесса (не требует установки) |
|
|
|
| `mongodb` | MongoDB - система управления NoSQL базами (*[установка](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
|
|
|
|
|
|
-# Импорт
|
|
|
+## Импорт
|
|
|
|
|
|
Модуль поддерживает ESM и CommonJS стандарты.
|
|
|
|
|
|
@@ -57,7 +57,7 @@ import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
|
const {DatabaseSchema} = require('@e22m4u/js-repository');
|
|
|
```
|
|
|
|
|
|
-# Описание
|
|
|
+## Описание
|
|
|
|
|
|
Модуль позволяет абстрагироваться от различных интерфейсов баз данных,
|
|
|
представляя их как именованные *источники данных*, подключаемые к *моделям*.
|
|
|
@@ -109,7 +109,7 @@ flowchart TD
|
|
|
G-->K
|
|
|
```
|
|
|
|
|
|
-# Пример
|
|
|
+## Пример
|
|
|
|
|
|
Объявление источника данных, модели и добавление нового документа в коллекцию.
|
|
|
|
|
|
@@ -154,7 +154,7 @@ console.log(country);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-# Схема
|
|
|
+## Схема
|
|
|
|
|
|
Экземпляр класса `DatabaseSchema` хранит определения источников данных и моделей.
|
|
|
|
|
|
@@ -202,7 +202,7 @@ dbs.defineModel({
|
|
|
const productRep = dbs.getRepository('product');
|
|
|
```
|
|
|
|
|
|
-# Источник данных
|
|
|
+## Источник данных
|
|
|
|
|
|
Источник хранит название выбранного адаптера и его настройки. Определение
|
|
|
нового источника выполняется методом `defineDatasource` экземпляра
|
|
|
@@ -238,7 +238,7 @@ dbs.defineDatasource({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Модель
|
|
|
+## Модель
|
|
|
|
|
|
Описывает структуру документа коллекции и связи к другим моделям. Определение
|
|
|
новой модели выполняется методом `defineModel` экземпляра `DatabaseSchema`.
|
|
|
@@ -266,7 +266,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Свойства
|
|
|
+## Свойства
|
|
|
|
|
|
Параметр `properties` находится в определении модели и принимает объект, ключи
|
|
|
которого являются свойствами этой модели, а значением тип свойства или объект
|
|
|
@@ -373,14 +373,14 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Валидаторы
|
|
|
+## Валидаторы
|
|
|
|
|
|
Валидаторы используются для проверки значения свойства перед записью в базу.
|
|
|
Проверка значения валидатором выполняется сразу после проверки типа, указанного
|
|
|
в определении свойства модели. [Пустые значения](#пустые-значения) пропускают
|
|
|
проверку валидаторами, так как не имеют полезной нагрузки.
|
|
|
|
|
|
-## Глобальные валидаторы
|
|
|
+### Глобальные валидаторы
|
|
|
|
|
|
Модуль поставляется с набором глобальных валидаторов:
|
|
|
|
|
|
@@ -470,7 +470,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Регистрация глобальных валидаторов
|
|
|
+### Регистрация глобальных валидаторов
|
|
|
|
|
|
Валидатором является функция, в которую передается значение соответствующего
|
|
|
поля перед записью в базу. Если во время проверки функция возвращает `false`,
|
|
|
@@ -570,7 +570,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Локальные валидаторы
|
|
|
+### Локальные валидаторы
|
|
|
|
|
|
Функция-валидатор может быть передана непосредственно в определении свойства
|
|
|
без предварительной регистрации. Для этого достаточно передать функцию
|
|
|
@@ -648,14 +648,14 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Трансформеры
|
|
|
+## Трансформеры
|
|
|
|
|
|
Трансформеры используются для модификации значения свойства перед проверкой
|
|
|
типа и передачей данных в базу. Трансформеры позволяют автоматически очищать
|
|
|
или приводить данные к нужному формату. [Пустые значения](#Пустые-значения)
|
|
|
не передаются в трансформеры, так как не имеют полезной нагрузки.
|
|
|
|
|
|
-## Глобальные трансформеры
|
|
|
+### Глобальные трансформеры
|
|
|
|
|
|
Модуль поставляется с набором глобальных трансформеров:
|
|
|
|
|
|
@@ -744,7 +744,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Регистрация глобальных трансформеров
|
|
|
+### Регистрация глобальных трансформеров
|
|
|
|
|
|
Трансформером является функция, которая принимает значение свойства и возвращает
|
|
|
новое значение. Функция может быть как синхронной, так и асинхронной (возвращать
|
|
|
@@ -797,7 +797,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Локальные трансформеры
|
|
|
+### Локальные трансформеры
|
|
|
|
|
|
Функция-трансформер может быть передана непосредственно в определении свойства без предварительной регистрации. Для этого достаточно передать функцию в параметр `transform` в качестве значения или элемента массива.
|
|
|
|
|
|
@@ -889,7 +889,7 @@ dbs.defineModel({
|
|
|
```
|
|
|
|
|
|
|
|
|
-# Пустые значения
|
|
|
+## Пустые значения
|
|
|
|
|
|
Разные типы свойств имеют свои наборы пустых значений. Эти наборы
|
|
|
используются для определения наличия полезной нагрузки в значении
|
|
|
@@ -908,7 +908,7 @@ dbs.defineModel({
|
|
|
| `'array'` | `undefined`, `null`, `[]` |
|
|
|
| `'object'` | `undefined`, `null`, `{}` |
|
|
|
|
|
|
-## Переопределение пустых значений
|
|
|
+### Переопределение пустых значений
|
|
|
|
|
|
Набор пустых значений для любого типа данных можно переопределить. Управление
|
|
|
этими наборами осуществляется через специальный сервис, который предоставляет
|
|
|
@@ -964,7 +964,7 @@ emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
|
|
|
считаться пустым и будет проходить проверки валидаторами, а также не будет
|
|
|
заменяться значением по умолчанию.
|
|
|
|
|
|
-# Репозиторий
|
|
|
+## Репозиторий
|
|
|
|
|
|
Выполняет операции чтения и записи документов определенной модели.
|
|
|
Получить репозиторий можно методом `getRepository` экземпляра `DatabaseSchema`.
|
|
|
@@ -1036,7 +1036,7 @@ const res = await countryRep.deleteById(1);
|
|
|
console.log(res); // true
|
|
|
```
|
|
|
|
|
|
-# Фильтрация
|
|
|
+## Фильтрация
|
|
|
|
|
|
Некоторые методы репозитория принимают объект настроек влияющий
|
|
|
на возвращаемый результат. Максимально широкий набор таких настроек
|
|
|
@@ -1110,7 +1110,7 @@ const userProfile = await userRepository.findOne({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## where
|
|
|
+### where
|
|
|
|
|
|
Параметр принимает объект с условиями выборки и поддерживает широкий
|
|
|
набор операторов сравнения.
|
|
|
@@ -1135,110 +1135,59 @@ const userProfile = await userRepository.findOne({
|
|
|
|
|
|
*i. Условия можно объединять операторами `and`, `or` и `nor`.*
|
|
|
|
|
|
-**Примеры**
|
|
|
-
|
|
|
-Применение условий выборки при подсчете документов.
|
|
|
-
|
|
|
-```js
|
|
|
-const res = await rep.count({
|
|
|
- authorId: 251,
|
|
|
- publishedAt: {
|
|
|
- lte: '2023-12-02T14:00:00.000Z',
|
|
|
- },
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-Применение оператора `or` при удалении документов.
|
|
|
-
|
|
|
-```js
|
|
|
-const res = await rep.delete({
|
|
|
- or: [
|
|
|
- {draft: true},
|
|
|
- {title: {ilike: '%draft%'}},
|
|
|
- ],
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-### Операторы сопоставления с шаблоном
|
|
|
-
|
|
|
-Операторы `like`, `nlike`, `ilike`, `nilike` предназначены для фильтрации
|
|
|
-строковых свойств на основе сопоставления с шаблоном, подобно оператору
|
|
|
-`LIKE` в SQL. Они позволяют находить значения, которые соответствуют
|
|
|
-определённой структуре, используя специальные символы.
|
|
|
-
|
|
|
-**`%`** соответствует любой последовательности из нуля или более символов:
|
|
|
-
|
|
|
-- `'А%'` найдет все строки, начинающиеся на "А";
|
|
|
-- `'%а'` найдет все строки, заканчивающиеся на "а";
|
|
|
-- `'%слово%'` найдет все строки, содержащие "слово" в любом месте;
|
|
|
-
|
|
|
-**`_`** соответствует ровно одному любому символу:
|
|
|
-
|
|
|
-- `'к_т'` найдет "кот", "кит", но не "крот" или "кт";
|
|
|
-- `'кот_'` найдет "коты", "коту" и "кота", но не "кот" или "котов";
|
|
|
-
|
|
|
-Если нужно найти сами символы `%` или `_` как часть строки, их необходимо
|
|
|
-экранировать с помощью обратного слэша `\`:
|
|
|
-
|
|
|
-- `'100\%'` найдет строку "100%";
|
|
|
-- `'file\_name'` найдет строку "file_name";
|
|
|
-- `'path\\to'` найдет строку "path\to";
|
|
|
-
|
|
|
-#### Описание операторов
|
|
|
-
|
|
|
##### `like`
|
|
|
|
|
|
-Выполняет сопоставление с шаблоном **с учетом регистра**.
|
|
|
+Выполняет сопоставление с шаблоном, с учетом регистра.
|
|
|
|
|
|
```javascript
|
|
|
-// Найдет {name: 'John Doe'}, но не {name: 'john doe'}
|
|
|
-const filter = {
|
|
|
+// найдет {name: 'John Doe'}, но не {name: 'john doe'}
|
|
|
+const res = await rep.find({
|
|
|
where: {
|
|
|
name: {like: 'John%'},
|
|
|
},
|
|
|
-};
|
|
|
+});
|
|
|
```
|
|
|
|
|
|
##### `nlike` (NOT LIKE)
|
|
|
|
|
|
-Противоположность `like`. Находит строки, которые **не соответствуют** шаблону, **с учетом регистра**.
|
|
|
+Находит документы, которые не соответствуют шаблону, с учетом регистра.
|
|
|
|
|
|
```javascript
|
|
|
-// Найдет все, кроме тех, что начинаются на 'John'
|
|
|
-const filter = {
|
|
|
+// найдет все, кроме тех, что начинаются на 'John'
|
|
|
+const res = await rep.find({
|
|
|
where: {
|
|
|
name: {nlike: 'John%'},
|
|
|
},
|
|
|
-};
|
|
|
+});
|
|
|
```
|
|
|
|
|
|
##### `ilike` (ILIKE)
|
|
|
|
|
|
-Выполняет сопоставление с шаблоном **без учета регистра** (case-**i**nsensitive).
|
|
|
+Выполняет сопоставление с шаблоном без учета регистра.
|
|
|
|
|
|
-```javascript
|
|
|
-// Найдет {name: 'John Doe'} и {name: 'john doe'}
|
|
|
-const filter = {
|
|
|
+```js
|
|
|
+// найдет {name: 'John Doe'} и {name: 'john doe'}
|
|
|
+const res = await rep.find({
|
|
|
where: {
|
|
|
name: {ilike: 'john%'},
|
|
|
},
|
|
|
-};
|
|
|
+});
|
|
|
```
|
|
|
|
|
|
##### `nilike` (NOT ILIKE)
|
|
|
|
|
|
-Противоположность `ilike`. Находит строки, которые **не соответствуют** шаблону, **без учета регистра**.
|
|
|
+Находит строки, которые не соответствуют шаблону, без учета регистра.
|
|
|
|
|
|
-```javascript
|
|
|
-// Найдет все, кроме тех, что начинаются на 'John' или 'john'
|
|
|
-const filter = {
|
|
|
+```js
|
|
|
+// найдет все, кроме тех, что начинаются на 'John' или 'john'
|
|
|
+const res = await rep.find({
|
|
|
where: {
|
|
|
name: {nilike: 'john%'},
|
|
|
},
|
|
|
-};
|
|
|
+});
|
|
|
```
|
|
|
|
|
|
-## order
|
|
|
+### order
|
|
|
|
|
|
Параметр упорядочивает выборку по указанным свойствам модели. Обратное
|
|
|
направление порядка можно задать постфиксом `DESC` в названии свойства.
|
|
|
@@ -1275,7 +1224,7 @@ const res = await rep.find({
|
|
|
|
|
|
*i. Направление порядка `ASC` указывать необязательно.*
|
|
|
|
|
|
-## include
|
|
|
+### include
|
|
|
|
|
|
Параметр включает связанные документы в результат вызываемого метода.
|
|
|
Названия включаемых связей должны быть определены в текущей модели.
|
|
|
@@ -1331,7 +1280,7 @@ const res = await rep.find({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Связи
|
|
|
+## Связи
|
|
|
|
|
|
Связи позволяют описывать отношения между моделями, что дает возможность
|
|
|
автоматически встраивать связанные данные с помощью опции `include`
|
|
|
@@ -1362,7 +1311,7 @@ console.log(user);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-## Определение связи
|
|
|
+### Определение связи
|
|
|
|
|
|
Свойство `relations` в определении модели принимает объект, ключи которого
|
|
|
являются названиями связей, а значения их параметрами. В дальнейшем название
|
|
|
@@ -1545,7 +1494,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-# Расширение
|
|
|
+## Расширение
|
|
|
|
|
|
Метод `getRepository` экземпляра `DatabaseSchema` проверяет наличие
|
|
|
существующего репозитория для указанной модели и возвращает его.
|
|
|
@@ -1591,7 +1540,7 @@ console.log(rep instanceof MyRepository); // true
|
|
|
*i. Так как экземпляры репозитория кэшируется, то замену конструктора
|
|
|
следует выполнять до обращения к методу `getRepository`.*
|
|
|
|
|
|
-# TypeScript
|
|
|
+## TypeScript
|
|
|
|
|
|
Получение типизированного репозитория с указанием интерфейса модели.
|
|
|
|
|
|
@@ -1634,12 +1583,12 @@ interface City {
|
|
|
const cityRep = dbs.getRepository<City, number>('city');
|
|
|
```
|
|
|
|
|
|
-# Тесты
|
|
|
+## Тесты
|
|
|
|
|
|
```bash
|
|
|
npm run test
|
|
|
```
|
|
|
|
|
|
-# Лицензия
|
|
|
+## Лицензия
|
|
|
|
|
|
MIT
|