Files
mongo-index-helper/README.md
pronchev b03dc9849f feat: smart index diffing on import
Compare desired indexes against existing ones before applying changes:
- skip indexes that are already up to date
- drop and recreate if definition changed
- handle key conflicts (same key, different name)
- drop obsolete indexes not present in the JSON

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 13:01:55 +03:00

96 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"
}
]
}
```
## Поведение импорта
- Коллекция не существует → создаётся автоматически
- Индексы сравниваются с существующими перед применением:
- Совпадает по имени и определению → пропускается
- Совпадает по имени, но определение изменилось → дропается и пересоздаётся
- Совпадает по ключу, но имя другое → старый дропается, создаётся с новым именем
- Есть в БД, но отсутствует в JSON → дропается как устаревший
- Индекс `_id_` игнорируется при экспорте и импорте