«Уникальный»: истинный индекс на MongoDB и Batch Insertion - PullRequest
0 голосов
/ 10 октября 2018

Допустим, я создал индекс для user_id

db.members.createIndex( { "user_id": 1 }, { unique: true } )

У меня есть три вопроса:

  1. Делает ли это "unique": true замедление пакетных вставок?
  2. Чем это отличается от "upsert"?
  3. Что происходит при попытке пакетной вставки, содержащей несколько дубликатов?Это просто сбой и откат?Или это просто не работает на тех немногих, которые потерпели неудачу из-за уникальной проверки?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

1.Делает ли это «уникальным»: true замедление вставки пакетов?

Это индекс, поэтому по определению да, он будет.При вставке необходимо подтвердить уникальность записей и т. Д. Не уверен, что нам нужно тратить слишком много времени на этот вопрос.

2.Чем это отличается от "upsert"?

Вопрос в том, что происходит, когда вы обновляете с опцией upsert: true.Согласно документам:

Чтобы избежать вставки одного и того же документа более одного раза, используйте upsert: true, если поле запроса уникально проиндексировано.

Если все операции update () завершают часть запроса до того, как какой-либо клиент успешно вставит данные, и в поле имени нет уникального индекса, то каждая операция обновления может привести к вставке.Чтобы MongoDB не вставлял один и тот же документ более одного раза, создайте уникальный индекс в поле имени.

С уникальным индексом, если несколько приложений выдают одно и то же обновление с помощью upsert: true, ровно одно update () успешно вставит новый документ.Остальные операции могут либо:

• обновить вновь вставленный документ, либо

• завершиться неудачно при попытке вставить дубликат.

Если операция не выполнена из-за дублированияошибка индексации, приложения могут повторить операцию, которая завершится успешно как операция обновления.upsert: true с точечным _id запросом

3.Что происходит при попытке пакетной вставки, содержащей несколько дубликатов?Это просто сбой и откат?Или это просто не работает на тех немногих, которые потерпели неудачу из-за уникальной проверки?

Это зависит.Это произойдет, если вы оставите значение по умолчанию для опции ordered.Но если вы установите значение false :

Если для заказано установлено значение false , документы будут вставлены в неупорядоченном формате иMongod может изменить порядок для увеличения производительности.Приложения не должны зависеть от упорядочения вставок при использовании неупорядоченного insertMany ().

и, что наиболее важно, если ошибка возникает во время массового insertMany:

с при заказе до false операция вставки будет продолжена для всех оставшихся документов.

Подробнее о неупорядоченных вставках

Подробнее об уникальном индексе с upsert: true

0 голосов
/ 10 октября 2018

Имеет ли это "уникальное" значение: true замедление вставки пакетов?

  • Поддержание индекса всегда приводит к дополнительным издержкам при записи / обновлении при ускорении чтения.Особенно с «уникальным»: правда;он собирается проверить ограничение, поэтому он будет немного медленнее, чем обычный индекс.Но если «user_id» будет уникальным, то это лучший способ обеспечить его.

Чем это отличается от «upsert»?

  • Я считаю, чтовопрос здесь, что происходит в случаях, когда обновления запускаются с «upsert»: true?Затем, если существует существующий идентификатор_пользователя, он будет просто перезаписан.

Что происходит при попытке пакетной вставки, содержащей несколько дубликатов?Это просто сбой и откат?Или это просто сбой на тех немногих, которые потерпели неудачу из-за уникальной проверки?

  • Дублирующиеся записи приведут к «ошибке поиска повторяющихся записей», если не установлено «upsert»: true.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...