|
@@ -8,90 +8,53 @@
|
|
|
npm install @e22m4u/js-repository
|
|
npm install @e22m4u/js-repository
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Опционально устанавливаем адаптер для базы данных.
|
|
|
|
|
|
|
+Опционально устанавливаем требуемый адаптер.
|
|
|
|
|
|
|
|
| | описание |
|
|
| | описание |
|
|
|
|-----------|--------------------------------------------------------------------------------------------------------------------------------|
|
|
|-----------|--------------------------------------------------------------------------------------------------------------------------------|
|
|
|
| `memory` | виртуальная база в памяти процесса (не требует установки) |
|
|
| `memory` | виртуальная база в памяти процесса (не требует установки) |
|
|
|
| `mongodb` | MongoDB - система управления NoSQL базами (*[установка](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
|
|
| `mongodb` | MongoDB - система управления NoSQL базами (*[установка](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
|
|
|
|
|
|
|
|
-## Введение
|
|
|
|
|
-
|
|
|
|
|
-Модуль позволяет объединить несколько баз данных в единую абстракцию «Схема».
|
|
|
|
|
-Являясь экземпляром класса `Schema`, абстракция предоставляет методы для
|
|
|
|
|
-определения «Источника данных» и «Модели». Источник заботится о подключении
|
|
|
|
|
-к базе, а модель описывает структуру документа коллекции и связи к другим
|
|
|
|
|
-моделям.
|
|
|
|
|
-
|
|
|
|
|
-Непосредственно чтение и запись производится с помощью «Репозитория», который
|
|
|
|
|
-можно получить для каждой модели, если она имеет источник данных.
|
|
|
|
|
-
|
|
|
|
|
-```mermaid
|
|
|
|
|
-flowchart TD
|
|
|
|
|
-
|
|
|
|
|
- A[Схема]
|
|
|
|
|
- subgraph Базы данных
|
|
|
|
|
- B[Источник 1]
|
|
|
|
|
- C[Источник 2]
|
|
|
|
|
- end
|
|
|
|
|
- A-->B
|
|
|
|
|
- A-->C
|
|
|
|
|
-
|
|
|
|
|
- subgraph Коллекции
|
|
|
|
|
- D[Модель A]
|
|
|
|
|
- E[Модель Б]
|
|
|
|
|
- F[Модель В]
|
|
|
|
|
- G[Модель Г]
|
|
|
|
|
- end
|
|
|
|
|
- B-->D
|
|
|
|
|
- B-->E
|
|
|
|
|
- C-->F
|
|
|
|
|
- C-->G
|
|
|
|
|
-
|
|
|
|
|
- H[Репозиторий A]
|
|
|
|
|
- I[Репозиторий Б]
|
|
|
|
|
- J[Репозиторий В]
|
|
|
|
|
- K[Репозиторий Г]
|
|
|
|
|
- D-->H
|
|
|
|
|
- E-->I
|
|
|
|
|
- F-->J
|
|
|
|
|
- G-->K
|
|
|
|
|
-```
|
|
|
|
|
|
|
+## Пример
|
|
|
|
|
|
|
|
-Репозиторий имеет набор методов для различных операций с документами модели.
|
|
|
|
|
-Некоторые из методов позволяют разрешать связи в момент обращения к данным,
|
|
|
|
|
-встраивая документы других моделей в результат выборки.
|
|
|
|
|
|
|
+```js
|
|
|
|
|
+import {Schema} from '@e22m4u/js-repository'
|
|
|
|
|
|
|
|
-Если модель `city` в своем определении имеет связь `country`, то пример
|
|
|
|
|
-запроса с включением связанных документов методом `find` может выглядеть так:
|
|
|
|
|
|
|
+// создание экземпляра схемы
|
|
|
|
|
+const schema = new Schema();
|
|
|
|
|
|
|
|
-```js
|
|
|
|
|
-const cities = await cityRep.find({
|
|
|
|
|
- include: 'country', // включить "country" в результат
|
|
|
|
|
|
|
+// определение источника "memory"
|
|
|
|
|
+schema.defineDatasource({
|
|
|
|
|
+ name: 'myMemory', // название нового источника
|
|
|
|
|
+ adapter: 'memory', // выбранный адаптер
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+// определение модели "country"
|
|
|
|
|
+schema.defineModel({
|
|
|
|
|
+ name: 'country', // название новой модели
|
|
|
|
|
+ datasource: 'myMemory', // выбранный источник
|
|
|
|
|
+ properties: { // поля модели
|
|
|
|
|
+ name: DataType.STRING, // поле "name" типа "string"
|
|
|
|
|
+ population: DataType.NUMBER, // поле "population" типа "number"
|
|
|
|
|
+ },
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// получение репозитория для модели "country"
|
|
|
|
|
+const countryRep = schema.getRepository('country');
|
|
|
|
|
+
|
|
|
|
|
+// добавление нового документа в коллекцию "country"
|
|
|
|
|
+const country = await countryRep.create({
|
|
|
|
|
+ name: 'Russia',
|
|
|
|
|
+ population: 143400000,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-console.log(cities);
|
|
|
|
|
-// [
|
|
|
|
|
-// {
|
|
|
|
|
-// "id": 24,
|
|
|
|
|
-// "name": "Moscow",
|
|
|
|
|
-// "countryId": 12, <= ключ целевой модели
|
|
|
|
|
-// "country": { <= связанный документ
|
|
|
|
|
-// "id": 12,
|
|
|
|
|
-// "name": "Russia",
|
|
|
|
|
-// }
|
|
|
|
|
-// },
|
|
|
|
|
-// {
|
|
|
|
|
-// "id": 25,
|
|
|
|
|
-// "name": "Bangkok",
|
|
|
|
|
-// "countryId": 13, <= ключ целевой модели
|
|
|
|
|
-// "country": { <= связанный документ
|
|
|
|
|
-// "id": 13,
|
|
|
|
|
-// "name": "Thailand",
|
|
|
|
|
-// }
|
|
|
|
|
-// },
|
|
|
|
|
-// ...
|
|
|
|
|
-// ]
|
|
|
|
|
|
|
+// вывод результата
|
|
|
|
|
+console.log(country);
|
|
|
|
|
+// {
|
|
|
|
|
+// "id": 1,
|
|
|
|
|
+// "name": "Russia",
|
|
|
|
|
+// "population": 143400000,
|
|
|
|
|
+// }
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## Тесты
|
|
## Тесты
|