|
|
@@ -3,23 +3,12 @@
|
|
|
Абстракция для работы с базами данных для Node.js
|
|
|
|
|
|
- [Установка](#Установка)
|
|
|
- - [Адаптеры](#Адаптеры)
|
|
|
-- [Точка входа](#Точка-входа)
|
|
|
+- [Введение](#Введение)
|
|
|
+- [Первый шаг](#Первый-шаг)
|
|
|
- [Источник данных](#Источник-данных)
|
|
|
- - [Параметры](#Параметры-источника)
|
|
|
- [Модель данных](#Модель-данных)
|
|
|
- - [Параметры модели](#Параметры-модели)
|
|
|
- - [Типы данных](#Типы-данных)
|
|
|
- - [Параметры поля](#Параметры-поля)
|
|
|
- [Репозиторий](#Репозиторий)
|
|
|
- - [Методы](#Методы)
|
|
|
- - [Параметры](#Параметры)
|
|
|
- [Фильтрация](#Фильтрация)
|
|
|
- - [where](#where)
|
|
|
- - [filter](#filter)
|
|
|
- - [order](#order)
|
|
|
- - [limit и skip](#limit-и-skip)
|
|
|
- - [fields](#limit-и-skip)
|
|
|
|
|
|
## Установка
|
|
|
|
|
|
@@ -36,19 +25,19 @@ npm install @e22m4u/js-repository
|
|
|
npm install @e22m4u/js-repository-mongodb-adapter
|
|
|
```
|
|
|
|
|
|
-#### Адаптеры
|
|
|
+**Доступные адаптеры**
|
|
|
|
|
|
| | описание |
|
|
|
|-----------|--------------------------------------------------------------------------------------------------------------------------------|
|
|
|
| `memory` | виртуальная база в памяти процесса (для разработки и тестирования) |
|
|
|
| `mongodb` | MongoDB - система управления NoSQL базами (*[установка](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
|
|
|
|
|
|
-## Точка входа
|
|
|
+## Введение
|
|
|
|
|
|
Модуль позволяет спроектировать систему связанных данных, доступ к которым
|
|
|
осуществляется посредством репозиториев. Каждый репозиторий имеет собственную
|
|
|
-модель данных, которая описывает структуру документа коллекции, а так же
|
|
|
-определяет связи к другим моделям.
|
|
|
+модель, которая описывает структуру документа коллекции, а так же определяет
|
|
|
+связи к другим моделям.
|
|
|
|
|
|
```mermaid
|
|
|
flowchart LR
|
|
|
@@ -56,6 +45,8 @@ flowchart LR
|
|
|
A[Источник]-->B[Модель]-->С[Ропозиторий];
|
|
|
```
|
|
|
|
|
|
+## Первый шаг
|
|
|
+
|
|
|
Определения источников и моделей хранятся в экземпляре класса `Schema`,
|
|
|
и первым шагом будет создание данного экземпляра.
|
|
|
|
|
|
@@ -89,10 +80,11 @@ schema.defineDatasource({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-#### Параметры источника
|
|
|
+**Параметры источника**
|
|
|
|
|
|
- `name: string` уникальное название
|
|
|
- `adapter: string` выбранный адаптер
|
|
|
+- дополнительные параметры (зависит от адаптера)
|
|
|
|
|
|
При желании можно использовать встроенный адаптер `memory`, который хранит
|
|
|
данные в памяти процесса. У него нет специальных настроек, и он отлично
|
|
|
@@ -107,101 +99,76 @@ schema.defineDatasource({
|
|
|
|
|
|
## Модель данных
|
|
|
|
|
|
-Когда источники определены, можно перейти к описанию моделей данных.
|
|
|
-Модель может определять как структуру документа, так и являться отражением
|
|
|
-реальной коллекции базы.
|
|
|
-
|
|
|
-Представьте себе коллекцию торговых точек, у каждой из которых имеются
|
|
|
-координаты `lat` и `lng`. Мы можем заранее определить модель для
|
|
|
-объекта координат методом `defineModel` и использовать ее в других
|
|
|
-коллекциях.
|
|
|
+Модель данных описывает структуру документа и может указывать на источник,
|
|
|
+который будет использован репозиторием для доступа к коллекции.
|
|
|
|
|
|
```js
|
|
|
+// объявление модели "city"
|
|
|
schema.defineModel({
|
|
|
- name: 'latLng', // название новой модели
|
|
|
+ name: 'city', // название новой модели
|
|
|
properties: { // поля модели
|
|
|
- lat: DataType.NUMBER, // поле широты
|
|
|
- lng: DataType.NUMBER, // поле долготы
|
|
|
+ name: DataType.STRING,
|
|
|
+ population: DataType.NUMBER,
|
|
|
},
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-#### Параметры модели
|
|
|
-
|
|
|
-- `name: string` уникальное название (обязательно)
|
|
|
-- `datasource: string` выбранный источник данных
|
|
|
-- `properties: object` определения полей модели
|
|
|
-- `relations: object` определения связей
|
|
|
+Название модели должно быть уникальным, так как оно используется
|
|
|
+для определения отношений к другим моделям, и для названия таблицы
|
|
|
+в базе. При необходимости можно явно задать название таблицы
|
|
|
+параметром `tableName`, если оно не соответствует названию модели.
|
|
|
|
|
|
-Параметр `properties` принимает объект, ключи которого являются именами
|
|
|
-полей, а значением тип поля или объект с дополнительными параметрами.
|
|
|
+Если модель отражает реальную коллекцию базы, а не является частью другой,
|
|
|
+то указывая параметр `datasource` появляется возможность получить репозиторий
|
|
|
+этой модели (см. [Репозиторий](#Репозиторий)), с помощью которого выполняются
|
|
|
+операции чтения и записи в базу.
|
|
|
|
|
|
```js
|
|
|
schema.defineModel({
|
|
|
- name: 'latLng',
|
|
|
+ name: 'city',
|
|
|
+ datasource: 'myMemory', // выбранный источник
|
|
|
properties: {
|
|
|
- lat: DataType.NUMBER, // краткое определение поля "lat"
|
|
|
- lng: { // расширенное определение поля "lng"
|
|
|
- type: DataType.NUMBER, // тип допустимого значения
|
|
|
- required: true, // исключает null и undefined
|
|
|
- },
|
|
|
+ name: DataType.STRING,
|
|
|
+ population: DataType.NUMBER,
|
|
|
},
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-#### Типы данных
|
|
|
-
|
|
|
-- `DataType.ANY`
|
|
|
-- `DataType.STRING`
|
|
|
-- `DataType.NUMBER`
|
|
|
-- `DataType.BOOLEAN`
|
|
|
-- `DataType.ARRAY`
|
|
|
-- `DataType.OBJECT`
|
|
|
-
|
|
|
-Модель `latLng` всего лишь описывает структуру объекта координат, тогда
|
|
|
-как торговая точка должна иметь реальную таблицу в базе. По аналогии с
|
|
|
-предыдущим примером, добавим модель `place`, но дополнительно укажем
|
|
|
-источник данных в параметре `datasource`
|
|
|
+Параметр `properties` принимает объект, ключи которого являются именами
|
|
|
+полей, а значением тип поля или объект с дополнительными параметрами.
|
|
|
+Эти настройки используются для проверки данных перед сохранением в базу
|
|
|
+и установки значений по умолчанию (если имеются).
|
|
|
|
|
|
```js
|
|
|
schema.defineModel({
|
|
|
- name: 'place',
|
|
|
- datasource: 'myMemory', // выбранный источник данных
|
|
|
+ name: 'city',
|
|
|
+ datasource: 'myMemory',
|
|
|
properties: {
|
|
|
- name: DataType.STRING, // поле для названия торговой точки
|
|
|
- location: { // поле для объекта координат
|
|
|
- type: DataType.OBJECT, // допускать только объекты
|
|
|
- model: 'latLng', // модель для объекта координат
|
|
|
+ name: DataType.STRING,
|
|
|
+ population: { // расширенные параметры
|
|
|
+ type: DataType.NUMBER, // тип значения
|
|
|
+ default: 0, // значение по умолчанию
|
|
|
},
|
|
|
},
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-В примере выше мы использовали модель `latLng` как структуру допустимого
|
|
|
-значения поля `location`. Возможный документ данной коллекции может
|
|
|
-выглядеть так:
|
|
|
-
|
|
|
-```json
|
|
|
-{
|
|
|
- "id": 1,
|
|
|
- "name": "Burger King",
|
|
|
- "location": {
|
|
|
- "lat": 32.412891,
|
|
|
- "lng": 34.7660061
|
|
|
- }
|
|
|
-}
|
|
|
-```
|
|
|
+#### Параметры модели
|
|
|
+
|
|
|
+- `name: string` название модели (обязательно)
|
|
|
+- `tableName: string` название коллекции в базе
|
|
|
+- `datasource: string` выбранный источник данных
|
|
|
+- `properties: object` определения полей модели
|
|
|
+- `relations: object` определения связей (см. Связи)
|
|
|
|
|
|
-Стоит обратить внимание, что мы могли бы не объявлять параметр `properties`,
|
|
|
-при этом теряя возможность проверки данных перед записью в базу.
|
|
|
+#### Типы данных
|
|
|
|
|
|
-```js
|
|
|
-schema.defineModel({
|
|
|
- name: 'place',
|
|
|
- adapter: 'myMemory',
|
|
|
- // параметр "properties" не указан
|
|
|
-});
|
|
|
-```
|
|
|
+- `DataType.ANY` разрешено любое значение
|
|
|
+- `DataType.STRING` только значение типа `string`
|
|
|
+- `DataType.NUMBER` только значение типа `number`
|
|
|
+- `DataType.BOOLEAN` только значение типа `boolean`
|
|
|
+- `DataType.ARRAY` только значение типа `array`
|
|
|
+- `DataType.OBJECT` только значение типа `object`
|
|
|
|
|
|
#### Параметры поля
|
|
|
|
|
|
@@ -216,12 +183,33 @@ schema.defineModel({
|
|
|
|
|
|
## Репозиторий
|
|
|
|
|
|
-В отличие от `latLng`, модель `place` имеет источник данных с названием
|
|
|
-`myMemory`, который был объявлен ранее. Наличие источника позволяет получить
|
|
|
-репозиторий по названию модели.
|
|
|
+Объявление модели имеет необязательный параметр `datasource`,
|
|
|
+который указывает на источник хранения данных. Наличие источника
|
|
|
+позволяет получить репозиторий по названию такой модели. Репозиторий,
|
|
|
+в свою очередь, предоставляет интерфейс для чтения и записи данных
|
|
|
+этой модели.
|
|
|
|
|
|
```js
|
|
|
-const rep = schema.getRepository('place');
|
|
|
+import {Schema} from '@e22m4u/js-repository';
|
|
|
+
|
|
|
+const schema = new Schema();
|
|
|
+
|
|
|
+schema.defineDatasource({
|
|
|
+ name: 'myMemory',
|
|
|
+ adapter: 'memory',
|
|
|
+});
|
|
|
+
|
|
|
+schema.defineModel({
|
|
|
+ name: 'city',
|
|
|
+ datasource: 'myMemory',
|
|
|
+ properties: {
|
|
|
+ name: DataType.STRING,
|
|
|
+ population: DataType.NUMBER,
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+// получение репозитория модели "city"
|
|
|
+const cityRep = schema.getRepository('city');
|
|
|
```
|
|
|
|
|
|
#### Методы
|
|
|
@@ -365,8 +353,6 @@ const result = await rep.find({
|
|
|
});
|
|
|
```
|
|
|
|
|
|
-
|
|
|
-
|
|
|
<!--
|
|
|
```js
|
|
|
// коллекция имеет три документа
|