Потому что 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 индекса.
Первый - текстовый, но без требования уникальности.
Второй - уникальный, на основе бинарного дерева.