@coriolis1986

Почему я получаю проблему нарушения уникальности в MongoDB?

Возникла ситуация 1-в-1, как здесь - https://stackoverflow.com/questions/41499611/mongo...

Что имел в виду человек в комментариях, когда он написал, что нашел решение:

do not use one index but two indexes
One for text index, one for name only


Как создаются подобные индексы?
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Потому что MongoDB при построении текстового индекса разбивает строку на слова, затем удаляет так называемые стоп-слова и может их нормализовывать.
Допустим у вас есть следующие 2 документа.
{text: "Два красивых яблока" }
{text: "Много яблок" }


Когда будет сформирован текстовый индекс, произойдет следующее. На самом деле все происходит немного иначе, в целом процесс таков.

Строка токенизируется на слова:
"Два красивых яблока" → ["Два", "красивых", "яблока"]
"Много яблок" →  ["Много", "яблок"]


Далее слова нормализуются

["Два", "красивых", "яблока"] → ["два", "красивый", "яблоко"]
["Много", "яблок"] →  ["много", "яблоко"]


Теперь начинается формирование словаря. Каждому слову начинаем присваивать номера.

["два", "красивый", "яблоко"] → [1, 2, 3], и словарь [1↔"два", 2↔"красивый", 3↔"яблоко"]
["много", "яблоко"]  →  [4, 3], и в словарь [1↔"два", 2↔"красивый", 3↔"яблоко", 4↔"много"]


Т.е. получаем следующий набор в индексе
[1→1, 2→1, 3→1]
[4→2, 3→2]

Т.к. это индекс, то разбиения объединяются в общий указатель
1→1, 
2→1, 
3→1, 
4→2 
3→2


А теперь смотрите, у нас индес объявлен уникальным, но указатели на записи повторяются, значит указатель не уникальный.
Поэтому и возникает ошибка.

Чтобы решить проблему, нужно создать 2 индекса.
Первый - текстовый, но без требования уникальности.
Второй - уникальный, на основе бинарного дерева.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы