2026-04-01 11:50:03 +03:00
|
|
|
|
# mongo-index-helper
|
|
|
|
|
|
|
|
|
|
|
|
Bash-скрипты для экспорта и импорта схемы индексов MongoDB. Работают внутри контейнера mongo через `mongosh`.
|
|
|
|
|
|
|
|
|
|
|
|
## Требования
|
|
|
|
|
|
|
|
|
|
|
|
- `mongosh` (входит в официальный образ `mongo:5+`)
|
|
|
|
|
|
|
|
|
|
|
|
## Использование
|
|
|
|
|
|
|
|
|
|
|
|
### Экспорт
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./export-indexes.sh --uri <uri> --db <dbname> --output <file>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
| Параметр | Описание | Обязательный |
|
|
|
|
|
|
|------------|---------------------------------|:------------:|
|
|
|
|
|
|
| `--uri` | MongoDB connection URI | да |
|
|
|
|
|
|
| `--db` | Имя базы данных | да |
|
|
|
|
|
|
| `--output` | Путь к выходному JSON-файлу | да |
|
|
|
|
|
|
|
|
|
|
|
|
**Пример:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./export-indexes.sh \
|
|
|
|
|
|
--uri "mongodb://admin:secret@localhost:27017/admin" \
|
|
|
|
|
|
--db mydb \
|
|
|
|
|
|
--output indexes.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Импорт
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./import-indexes.sh --uri <uri> --db <dbname> --input <file> [--dry-run]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
| Параметр | Описание | Обязательный |
|
|
|
|
|
|
|-------------|-------------------------------------------------------|:------------:|
|
|
|
|
|
|
| `--uri` | MongoDB connection URI | да |
|
|
|
|
|
|
| `--db` | Имя базы данных | да |
|
|
|
|
|
|
| `--input` | Путь к входному JSON-файлу | да |
|
|
|
|
|
|
| `--dry-run` | Показать планируемые действия без реального выполнения | нет |
|
|
|
|
|
|
|
|
|
|
|
|
**Примеры:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Предварительный просмотр
|
|
|
|
|
|
./import-indexes.sh \
|
|
|
|
|
|
--uri "mongodb://admin:secret@localhost:27017/admin" \
|
|
|
|
|
|
--db mydb \
|
|
|
|
|
|
--input indexes.json \
|
|
|
|
|
|
--dry-run
|
|
|
|
|
|
|
|
|
|
|
|
# Реальный импорт
|
|
|
|
|
|
./import-indexes.sh \
|
|
|
|
|
|
--uri "mongodb://admin:secret@localhost:27017/admin" \
|
|
|
|
|
|
--db mydb \
|
|
|
|
|
|
--input indexes.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Формат файла
|
|
|
|
|
|
|
|
|
|
|
|
Индексы сохраняются в JSON без указания имени БД:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"users": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"key": { "email": 1 },
|
|
|
|
|
|
"name": "email_1",
|
|
|
|
|
|
"unique": true
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"key": { "createdAt": 1 },
|
|
|
|
|
|
"name": "createdAt_1",
|
|
|
|
|
|
"expireAfterSeconds": 2592000
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"orders": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"key": { "userId": 1, "status": 1 },
|
|
|
|
|
|
"name": "userId_1_status_1"
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Поведение импорта
|
|
|
|
|
|
|
|
|
|
|
|
- Коллекция не существует → создаётся автоматически
|
2026-04-01 13:01:55 +03:00
|
|
|
|
- Индексы сравниваются с существующими перед применением:
|
|
|
|
|
|
- Совпадает по имени и определению → пропускается
|
|
|
|
|
|
- Совпадает по имени, но определение изменилось → дропается и пересоздаётся
|
|
|
|
|
|
- Совпадает по ключу, но имя другое → старый дропается, создаётся с новым именем
|
|
|
|
|
|
- Есть в БД, но отсутствует в JSON → дропается как устаревший
|
2026-04-01 11:50:03 +03:00
|
|
|
|
- Индекс `_id_` игнорируется при экспорте и импорте
|