Browse Source

chore: updates README.md

e22m4u 2 years ago
parent
commit
31b0c49c38
1 changed files with 77 additions and 91 deletions
  1. 77 91
      README.md

+ 77 - 91
README.md

@@ -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
 // коллекция имеет три документа