MongoException: индекс с именем: код уже существует с другими параметрами

У меня есть коллекция mongodb term со следующей структурой

{
    "_id" : "00002c34-a4ca-42ee-b242-e9bab8e3a01f",
    "terminologyClass" : "USER",
    "code" : "X67",
    "terminology" : "some term related notes",
    "notes" : "some notes"
}

и класс Java, представляющий коллекцию терминов как Term.java

@Document
public class Term{  

    @Id
    protected String termId;

    @Indexed
    protected String terminologyClass;

    @Indexed(unique=true)
    protected String code;

    @Indexed
    protected String terminology;

    protected String notes;

    //getters & setters
}

У меня много документов в коллекции term. Теперь я добавил новое поле в Term.java как

@Indexed
protected String status;

После добавления поля status в Term.java при вставке нового термина в коллекцию term я получаю исключение:

com.mongodb.MongoException: индекс с именем: код уже существует с другими параметрами

Я использую версию MongoDB: 2.6.5 и версию spring-data-mongodb: 1.3.2.


person faizi    schedule 14.05.2015    source источник
comment
Не совсем связано с этой проблемой, но это одно и то же сообщение об ошибке, поэтому может быть полезно для людей, которые ищут: вы не можете добавить два индекса TEXT в коллекцию с разными параметрами. Может быть только один (хотя он может ссылаться на несколько полей). См. docs.mongodb.com/manual/core/index-text.   -  person naught101    schedule 06.11.2020


Ответы (3)


У вас уже есть индекс для этой коллекции с таким же именем, но с другим определением. Я предполагаю, что ваш текущий индекс кода не уникален

попробуй: db.Term.getIndexes()

Если это действительно так (у вас есть неуникальный индекс над полем кода), выдайте: db.Term.dropIndex("code_1") (замените на имя индекса поля кода).

В следующий раз, когда вы загрузите свое приложение, оно должно работать нормально.

В качестве альтернативы удалите уникальный атрибут из аннотации @Indexed (если вы не хотите, чтобы он был уникальным).

person Ori Dar    schedule 14.05.2015
comment
Ваша догадка верна. Удалил индекс кода и удалил дубликаты из кода, а затем перезагрузка приложения устранила проблему. Спасибо :) - person faizi; 14.05.2015
comment
Я понизил версию моей библиотеки Ruby MongoDB, и внезапно все мои индексы с expireAfterSeconds уже существовали с другими параметрами, поэтому мне пришлось их все удалить. - person Hubro; 12.07.2016

Вы пытались удалить свою коллекцию и попробовать еще раз? обычно возникает много конфликтов при применении нового сопоставления Java с существующей коллекцией mongodb.

person Community    schedule 14.05.2015

Попытка создать несколько составных текстовых индексов также может вызвать эту ошибку.

Допускается только один текстовый индекс для текстового поиска на коллекцию на документы.

В многопользовательской базе данных мы хотели обеспечить уникальность данных каждого клиента с помощью составных индексов.

db.users.createIndex( { customer: "text", email: "text"}, { unique: true } );
db.users.createIndex( { customer: "text", cell: "text"}, { unique: true } );

Это вызвало ошибку оператора.

Однако замена их на обычные индексы решила проблему.

db.users.createIndex( { customer: 1, email: 1}, { unique: true } );
db.users.createIndex( { customer: 1, cell: 1}, { unique: true } );
person David    schedule 05.07.2021