Что произойдет, если изменить значение в проиндексированном поле в MongoDB?

«Что произойдет, если изменить значение в проиндексированном поле в MongoDB?» — вопрос из категории Базы данных, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MongoDB автоматически обновит соответствующие записи во всех индексах, затрагивающих это поле. Это гарантирует консистентность, но имеет последствия для производительности.

Ключевые моменты и пример для Node.js (драйвер mongodb):

  1. Производительность: Каждое обновление индексированного поля приводит к операции записи как в коллекцию, так и в индекс. Частые обновления таких полей могут стать узким местом.

  2. Уникальные индексы: При обновлении на новое значение будет проверяться уникальность.

    const { MongoClient } = require('mongodb');
    const client = new MongoClient(uri);
    await client.connect();
    const collection = client.db('test').collection('users');
    
    // Создаем уникальный индекс по email
    await collection.createIndex({ email: 1 }, { unique: true });
    
    // Это выбросит дубликат ключа ошибку, если 'new@mail.com' уже существует
    await collection.updateOne(
      { _id: userId },
      { $set: { email: 'new@mail.com' } }
    );
  3. Составные индексы: Если поле является частью составного индекса (например, { category: 1, score: -1 }), обновление этого поля приведет к перемещению документа в B-дереве этого составного индекса.

  4. TTL-индексы: Если изменить значение поля, на котором построен TTL-индекс (например, createdAt), таймер удаления документа сбросится, отсчет начнется заново с нового значения.

Рекомендация: Избегайте индексирования полей, значения которых часто обновляются, если это не критично для производительности запросов. Всегда анализируйте профиль запросов (db.collection.explain()) перед созданием индексов.