|
|
@@ -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
|
|
|
|
|
|
Параметр принимает объект с условиями выборки и поддерживает широкий
|
|
|
набор операторов сравнения.
|
|
|
@@ -1159,7 +1159,86 @@ const res = await rep.delete({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-### order
|
|
|
+### Операторы сопоставления с шаблоном
|
|
|
+
|
|
|
+Операторы `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 = {
|
|
|
+ where: {
|
|
|
+ name: {like: 'John%'},
|
|
|
+ },
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+##### `nlike` (NOT LIKE)
|
|
|
+
|
|
|
+Противоположность `like`. Находит строки, которые **не соответствуют** шаблону, **с учетом регистра**.
|
|
|
+
|
|
|
+```javascript
|
|
|
+// Найдет все, кроме тех, что начинаются на 'John'
|
|
|
+const filter = {
|
|
|
+ where: {
|
|
|
+ name: {nlike: 'John%'},
|
|
|
+ },
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+##### `ilike` (ILIKE)
|
|
|
+
|
|
|
+Выполняет сопоставление с шаблоном **без учета регистра** (case-**i**nsensitive).
|
|
|
+
|
|
|
+```javascript
|
|
|
+// Найдет {name: 'John Doe'} и {name: 'john doe'}
|
|
|
+const filter = {
|
|
|
+ where: {
|
|
|
+ name: {ilike: 'john%'},
|
|
|
+ },
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+##### `nilike` (NOT ILIKE)
|
|
|
+
|
|
|
+Противоположность `ilike`. Находит строки, которые **не соответствуют** шаблону, **без учета регистра**.
|
|
|
+
|
|
|
+```javascript
|
|
|
+// Найдет все, кроме тех, что начинаются на 'John' или 'john'
|
|
|
+const filter = {
|
|
|
+ where: {
|
|
|
+ name: {nilike: 'john%'},
|
|
|
+ },
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+## order
|
|
|
|
|
|
Параметр упорядочивает выборку по указанным свойствам модели. Обратное
|
|
|
направление порядка можно задать постфиксом `DESC` в названии свойства.
|
|
|
@@ -1196,7 +1275,7 @@ const res = await rep.find({
|
|
|
|
|
|
*i. Направление порядка `ASC` указывать необязательно.*
|
|
|
|
|
|
-### include
|
|
|
+## include
|
|
|
|
|
|
Параметр включает связанные документы в результат вызываемого метода.
|
|
|
Названия включаемых связей должны быть определены в текущей модели.
|
|
|
@@ -1252,7 +1331,7 @@ const res = await rep.find({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Связи
|
|
|
+# Связи
|
|
|
|
|
|
Связи позволяют описывать отношения между моделями, что дает возможность
|
|
|
автоматически встраивать связанные данные с помощью опции `include`
|
|
|
@@ -1283,7 +1362,7 @@ console.log(user);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-### Определение связи
|
|
|
+## Определение связи
|
|
|
|
|
|
Свойство `relations` в определении модели принимает объект, ключи которого
|
|
|
являются названиями связей, а значения их параметрами. В дальнейшем название
|
|
|
@@ -1466,7 +1545,7 @@ dbs.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-## Расширение
|
|
|
+# Расширение
|
|
|
|
|
|
Метод `getRepository` экземпляра `DatabaseSchema` проверяет наличие
|
|
|
существующего репозитория для указанной модели и возвращает его.
|
|
|
@@ -1512,7 +1591,7 @@ console.log(rep instanceof MyRepository); // true
|
|
|
*i. Так как экземпляры репозитория кэшируется, то замену конструктора
|
|
|
следует выполнять до обращения к методу `getRepository`.*
|
|
|
|
|
|
-## TypeScript
|
|
|
+# TypeScript
|
|
|
|
|
|
Получение типизированного репозитория с указанием интерфейса модели.
|
|
|
|
|
|
@@ -1555,12 +1634,12 @@ interface City {
|
|
|
const cityRep = dbs.getRepository<City, number>('city');
|
|
|
```
|
|
|
|
|
|
-## Тесты
|
|
|
+# Тесты
|
|
|
|
|
|
```bash
|
|
|
npm run test
|
|
|
```
|
|
|
|
|
|
-## Лицензия
|
|
|
+# Лицензия
|
|
|
|
|
|
MIT
|