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

3.3 KiB
Raw Permalink Blame History

mongo-index-helper

Bash-скрипты для экспорта и импорта схемы индексов MongoDB. Работают внутри контейнера mongo через mongosh.

Требования

  • mongosh (входит в официальный образ mongo:5+)

Использование

Экспорт

./export-indexes.sh --uri <uri> --db <dbname> --output <file>
Параметр Описание Обязательный
--uri MongoDB connection URI да
--db Имя базы данных да
--output Путь к выходному JSON-файлу да

Пример:

./export-indexes.sh \
  --uri "mongodb://admin:secret@localhost:27017/admin" \
  --db mydb \
  --output indexes.json

Импорт

./import-indexes.sh --uri <uri> --db <dbname> --input <file> [--dry-run]
Параметр Описание Обязательный
--uri MongoDB connection URI да
--db Имя базы данных да
--input Путь к входному JSON-файлу да
--dry-run Показать планируемые действия без реального выполнения нет

Примеры:

# Предварительный просмотр
./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 без указания имени БД:

{
  "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_ игнорируется при экспорте и импорте