|
|
@@ -6,12 +6,13 @@
|
|
|
|
|
|
- [Установка](#Установка)
|
|
|
- [Пример](#Пример)
|
|
|
+- [Схема](#Схема)
|
|
|
- [Источник данных](#Источник-данных)
|
|
|
- [Модель](#Модель)
|
|
|
-- [Репозиторий](#Репозиторий)
|
|
|
- [Свойства](#Свойства)
|
|
|
-- [Связи](#Связи)
|
|
|
+- [Репозиторий](#Репозиторий)
|
|
|
- [Фильтрация](#Фильтрация)
|
|
|
+- [Связи](#Связи)
|
|
|
- [Тесты](#Тесты)
|
|
|
- [Лицензия](#Лицензия)
|
|
|
|
|
|
@@ -184,6 +185,84 @@ schema.defineModel({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
+## Свойства
|
|
|
+
|
|
|
+Параметр `properties` находится в составе модели и принимает объект, ключи
|
|
|
+которого являются свойствами этой модели, а значением тип свойства или объект
|
|
|
+с дополнительными параметрами.
|
|
|
+
|
|
|
+**Тип данных**
|
|
|
+
|
|
|
+- `DataType.ANY` разрешено любое значение
|
|
|
+- `DataType.STRING` только значение типа `string`
|
|
|
+- `DataType.NUMBER` только значение типа `number`
|
|
|
+- `DataType.BOOLEAN` только значение типа `boolean`
|
|
|
+- `DataType.ARRAY` только значение типа `array`
|
|
|
+- `DataType.OBJECT` только значение типа `object`
|
|
|
+
|
|
|
+**Параметры**
|
|
|
+
|
|
|
+- `type: string` тип допустимого значения (обязательно)
|
|
|
+- `itemType: string` тип элемента массива (для `type: 'array'`)
|
|
|
+- `model: string` модель объекта (для `type: 'object'`)
|
|
|
+- `primaryKey: boolean` объявить свойство первичным ключом
|
|
|
+- `columnName: string` переопределение названия колонки
|
|
|
+- `columnType: string` тип колонки (определяется адаптером)
|
|
|
+- `required: boolean` объявить свойство обязательным
|
|
|
+- `default: any` значение по умолчанию
|
|
|
+
|
|
|
+**Примеры**
|
|
|
+
|
|
|
+Краткое определение свойств модели.
|
|
|
+
|
|
|
+```js
|
|
|
+schema.defineModel({
|
|
|
+ name: 'city',
|
|
|
+ properties: { // свойства модели
|
|
|
+ name: DataType.STRING, // тип свойства "string"
|
|
|
+ population: DataType.NUMBER, // тип свойства "number"
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+Расширенное определение свойств модели.
|
|
|
+
|
|
|
+```js
|
|
|
+schema.defineModel({
|
|
|
+ name: 'city',
|
|
|
+ properties: { // свойства модели
|
|
|
+ name: {
|
|
|
+ type: DataType.STRING, // тип свойства "string" (обязательно)
|
|
|
+ required: true, // исключение значений undefined и null
|
|
|
+ },
|
|
|
+ population: {
|
|
|
+ type: DataType.NUMBER, // тип свойства "number" (обязательно)
|
|
|
+ default: 0, // значение по умолчанию
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+Фабричное значение по умолчанию. Возвращаемое значение функции будет
|
|
|
+определено в момент записи документа.
|
|
|
+
|
|
|
+```js
|
|
|
+schema.defineModel({
|
|
|
+ name: 'article',
|
|
|
+ properties: { // свойства модели
|
|
|
+ tags: {
|
|
|
+ type: DataType.ARRAY, // тип свойства "array" (обязательно)
|
|
|
+ itemType: DataType.STRING, // тип элемента "string"
|
|
|
+ default: () => [], // фабричное значение
|
|
|
+ },
|
|
|
+ createdAt: {
|
|
|
+ type: DataType.STRING, // тип свойства "string" (обязательно)
|
|
|
+ default: () => new Date().toISOString(), // фабричное значение
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
## Репозиторий
|
|
|
|
|
|
Выполняет операции чтения и записи документов определенной модели.
|
|
|
@@ -255,84 +334,106 @@ const res = await countryRep.deleteById(1);
|
|
|
console.log(res); // true
|
|
|
```
|
|
|
|
|
|
-## Свойства
|
|
|
+## Фильтрация
|
|
|
|
|
|
-Параметр `properties` находится в составе модели и принимает объект, ключи
|
|
|
-которого являются свойствами этой модели, а значением тип свойства или объект
|
|
|
-с дополнительными параметрами.
|
|
|
+Некоторые методы репозитория принимают объект настроек влияющий
|
|
|
+на возвращаемый результат. Максимально широкий набор таких настроек
|
|
|
+имеет первый параметр метода `find`, где ожидается объект содержащий
|
|
|
+набор опций указанных ниже.
|
|
|
|
|
|
-**Тип данных**
|
|
|
+- `where: object` объект выборки
|
|
|
+- `order: string[]` указание порядка
|
|
|
+- `limit: number` ограничение количества документов
|
|
|
+- `skip: number` пропуск документов
|
|
|
+- `fields: string[]` выбор необходимых свойств модели
|
|
|
+- `include: object` включение связанных данных в результат
|
|
|
|
|
|
-- `DataType.ANY` разрешено любое значение
|
|
|
-- `DataType.STRING` только значение типа `string`
|
|
|
-- `DataType.NUMBER` только значение типа `number`
|
|
|
-- `DataType.BOOLEAN` только значение типа `boolean`
|
|
|
-- `DataType.ARRAY` только значение типа `array`
|
|
|
-- `DataType.OBJECT` только значение типа `object`
|
|
|
+### where
|
|
|
|
|
|
-**Параметры**
|
|
|
+Параметр принимает объект с условиями выборки и поддерживает широкий
|
|
|
+набор операторов сравнения.
|
|
|
|
|
|
-- `type: string` тип допустимого значения (обязательно)
|
|
|
-- `itemType: string` тип элемента массива (для `type: 'array'`)
|
|
|
-- `model: string` модель объекта (для `type: 'object'`)
|
|
|
-- `primaryKey: boolean` объявить свойство первичным ключом
|
|
|
-- `columnName: string` переопределение названия колонки
|
|
|
-- `columnType: string` тип колонки (определяется адаптером)
|
|
|
-- `required: boolean` объявить свойство обязательным
|
|
|
-- `default: any` значение по умолчанию
|
|
|
+`{foo: 'bar'}` поиск по значению свойства `foo`
|
|
|
+`{foo: {eq: 'bar'}}` оператор равенства `eq`
|
|
|
+`{foo: {neq: 'bar'}}` оператор неравенства `neq`
|
|
|
+`{foo: {gt: 5}}` оператор "больше" `gt`
|
|
|
+`{foo: {lt: 10}}` оператор "меньше" `lt`
|
|
|
+`{foo: {gte: 5}}` оператор "больше или равно" `gte`
|
|
|
+`{foo: {lte: 10}}` оператор "меньше или равно" `lte`
|
|
|
+`{foo: {inq: ['bar', 'baz']}}` равенство одного из значений `inq`
|
|
|
+`{foo: {nin: ['bar', 'baz']}}` исключение значений массива `nin`
|
|
|
+`{foo: {between: [5, 10]}}` оператор диапазона `between`
|
|
|
+`{foo: {exists: true}}` оператор наличия значения `exists`
|
|
|
+`{foo: {like: 'bar'}}` оператор поиска подстроки `like`
|
|
|
+`{foo: {ilike: 'BaR'}}` регистронезависимая версия `ilike`
|
|
|
+`{foo: {nlike: 'bar'}}` оператор исключения подстроки `nlike`
|
|
|
+`{foo: {nilike: 'BaR'}}` регистронезависимая версия `nilike`
|
|
|
+`{foo: {regexp: 'ba.+'}}` оператор регулярного выражения `regexp`
|
|
|
+`{foo: {regexp: 'ba.+', flags: 'i'}}` флаги регулярного выражения
|
|
|
+
|
|
|
+*i. Условия можно объединять операторами `and`, `or` и `nor`.*
|
|
|
|
|
|
**Примеры**
|
|
|
|
|
|
-Краткое определение свойств модели.
|
|
|
+Применение условий выборки при подсчете документов.
|
|
|
|
|
|
```js
|
|
|
-schema.defineModel({
|
|
|
- name: 'city',
|
|
|
- properties: { // свойства модели
|
|
|
- name: DataType.STRING, // тип свойства "string"
|
|
|
- population: DataType.NUMBER, // тип свойства "number"
|
|
|
+const res = await rep.count({
|
|
|
+ authorId: 251,
|
|
|
+ publishedAt: {
|
|
|
+ lte: '2023-12-02T14:00:00.000Z',
|
|
|
},
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-Расширенное определение свойств модели.
|
|
|
+Применение оператора `or` при удалении документов.
|
|
|
|
|
|
```js
|
|
|
-schema.defineModel({
|
|
|
- name: 'city',
|
|
|
- properties: { // свойства модели
|
|
|
- name: {
|
|
|
- type: DataType.STRING, // тип свойства "string" (обязательно)
|
|
|
- required: true, // исключение значений undefined и null
|
|
|
- },
|
|
|
- population: {
|
|
|
- type: DataType.NUMBER, // тип свойства "number" (обязательно)
|
|
|
- default: 0, // значение по умолчанию
|
|
|
- },
|
|
|
- },
|
|
|
+const res = await rep.delete({
|
|
|
+ or: [
|
|
|
+ {draft: true},
|
|
|
+ {title: {like: 'draft'}},
|
|
|
+ ],
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-Фабричное значение по умолчанию. Возвращаемое значение функции будет
|
|
|
-определено в момент записи документа.
|
|
|
+### order
|
|
|
+
|
|
|
+Параметр упорядочивает выборку по указанным свойствам модели. Обратное
|
|
|
+направление порядка можно задать постфиксом `DESC` в названии свойства.
|
|
|
+
|
|
|
+**Примеры**
|
|
|
+
|
|
|
+Упорядочить по полю `createdAt`
|
|
|
|
|
|
```js
|
|
|
-schema.defineModel({
|
|
|
- name: 'article',
|
|
|
- properties: { // свойства модели
|
|
|
- tags: {
|
|
|
- type: DataType.ARRAY, // тип свойства "array" (обязательно)
|
|
|
- itemType: DataType.STRING, // тип элемента "string"
|
|
|
- default: () => [], // фабричное значение
|
|
|
- },
|
|
|
- createdAt: {
|
|
|
- type: DataType.STRING, // тип свойства "string" (обязательно)
|
|
|
- default: () => new Date().toISOString(), // фабричное значение
|
|
|
- },
|
|
|
- },
|
|
|
+const res = await rep.find({
|
|
|
+ order: 'createdAt',
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+Упорядочить по полю `createdAt` в обратном порядке.
|
|
|
+
|
|
|
+```js
|
|
|
+const res = await rep.find({
|
|
|
+ order: 'createdAt DESC',
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+Упорядочить по нескольким свойствам в разных направлениях.
|
|
|
+
|
|
|
+```js
|
|
|
+const res = await rep.find({
|
|
|
+ order: [
|
|
|
+ 'title',
|
|
|
+ 'price ASC',
|
|
|
+ 'featured DESC',
|
|
|
+ ],
|
|
|
});
|
|
|
```
|
|
|
|
|
|
+*i. Направление порядка `ASC` указывать необязательно.*
|
|
|
+
|
|
|
## Связи
|
|
|
|
|
|
Параметр `relations` находится в составе определения модели и принимает
|
|
|
@@ -469,106 +570,6 @@ schema.defineModel({
|
|
|
})
|
|
|
```
|
|
|
|
|
|
-## Фильтрация
|
|
|
-
|
|
|
-Некоторые методы репозитория принимают объект настроек влияющий
|
|
|
-на возвращаемый результат. Максимально широкий набор таких настроек
|
|
|
-имеет первый параметр метода `find`, где ожидается объект содержащий
|
|
|
-набор опций указанных ниже.
|
|
|
-
|
|
|
-- `where: object` объект выборки
|
|
|
-- `order: string[]` указание порядка
|
|
|
-- `limit: number` ограничение количества документов
|
|
|
-- `skip: number` пропуск документов
|
|
|
-- `fields: string[]` выбор необходимых свойств модели
|
|
|
-- `include: object` включение связанных данных в результат
|
|
|
-
|
|
|
-### where
|
|
|
-
|
|
|
-Параметр принимает объект с условиями выборки и поддерживает широкий
|
|
|
-набор операторов сравнения.
|
|
|
-
|
|
|
-`{foo: 'bar'}` поиск по значению свойства `foo`
|
|
|
-`{foo: {eq: 'bar'}}` оператор равенства `eq`
|
|
|
-`{foo: {neq: 'bar'}}` оператор неравенства `neq`
|
|
|
-`{foo: {gt: 5}}` оператор "больше" `gt`
|
|
|
-`{foo: {lt: 10}}` оператор "меньше" `lt`
|
|
|
-`{foo: {gte: 5}}` оператор "больше или равно" `gte`
|
|
|
-`{foo: {lte: 10}}` оператор "меньше или равно" `lte`
|
|
|
-`{foo: {inq: ['bar', 'baz']}}` равенство одного из значений `inq`
|
|
|
-`{foo: {nin: ['bar', 'baz']}}` исключение значений массива `nin`
|
|
|
-`{foo: {between: [5, 10]}}` оператор диапазона `between`
|
|
|
-`{foo: {exists: true}}` оператор наличия значения `exists`
|
|
|
-`{foo: {like: 'bar'}}` оператор поиска подстроки `like`
|
|
|
-`{foo: {ilike: 'BaR'}}` регистронезависимая версия `ilike`
|
|
|
-`{foo: {nlike: 'bar'}}` оператор исключения подстроки `nlike`
|
|
|
-`{foo: {nilike: 'BaR'}}` регистронезависимая версия `nilike`
|
|
|
-`{foo: {regexp: 'ba.+'}}` оператор регулярного выражения `regexp`
|
|
|
-`{foo: {regexp: 'ba.+', flags: 'i'}}` флаги регулярного выражения
|
|
|
-
|
|
|
-*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: {like: 'draft'}},
|
|
|
- ],
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-### order
|
|
|
-
|
|
|
-Параметр упорядочивает выборку по указанным свойствам модели. Обратное
|
|
|
-направление порядка можно задать постфиксом `DESC` в названии свойства.
|
|
|
-
|
|
|
-**Примеры**
|
|
|
-
|
|
|
-Упорядочить по полю `createdAt`
|
|
|
-
|
|
|
-```js
|
|
|
-const res = await rep.find({
|
|
|
- order: 'createdAt',
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-Упорядочить по полю `createdAt` в обратном порядке.
|
|
|
-
|
|
|
-```js
|
|
|
-const res = await rep.find({
|
|
|
- order: 'createdAt DESC',
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-Упорядочить по нескольким свойствам в разных направлениях.
|
|
|
-
|
|
|
-```js
|
|
|
-const res = await rep.find({
|
|
|
- order: [
|
|
|
- 'title',
|
|
|
- 'price ASC',
|
|
|
- 'featured DESC',
|
|
|
- ],
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-*i. Направление порядка `ASC` указывать необязательно.*
|
|
|
-
|
|
|
## Тесты
|
|
|
|
|
|
```bash
|