В чем разница между createIndex() и ensureIndex() в Java с использованием MongoDB? Я гуглил это, но не получил удовлетворительного ответа.
Разница между createIndex() и sureIndex() в java с использованием mongodb
Ответы (4)
Обновление 2: исходный ответ, а также первое обновление ошибочно ссылаются на документацию оболочки Mongo вместо Java API.
В Java DBCollection.ensureIndex() устарела в версии 2.12 и удалена в версии 3.0. DBCollection.createIndex() — это что следует использовать.
Обновление:db.collection.ensureIndex() устарело, начиная с версии 3.0.0.
Теперь это псевдоним для db.collection.createIndex().
Исходный вариант:createIndex() – это устарел с версии 1.8
Он использовался для создания индексов для коллекций, тогда как ensureIndex() создает индекс для указанного поля, если индекс еще не существует. Более того, когда мы выполняем createIndex() дважды, второе выполнение просто не удается, тогда как с ensureIndex() вы можете вызывать его несколько раз, и оно не завершится ошибкой.
И еще одна вещь, которую они изменили в отношении поведения ensureIndex(), в предыдущих версиях mongodb (версии ниже 2.6), если запись индекса для существующего документа превышает максимальную длину ключа индекса, индекс будет создан, но Mongodb не будет индексировать такие документы, тогда как в последней версии индекс не будет создан.
createIndex на самом деле будет программный сбой (по крайней мере, в 3.0). При последующих вызовах он вернет ok, но также обратите внимание на то, что все индексы уже существуют.
- person PeterM; 30.03.2017
В API Java DBCollection.ensureIndex() считается устаревшим, ровно наоборот по сравнению с «обычным» API MongoDB (на момент ответа). Обновление: это несоответствие, по-видимому, с тех пор устранено, и теперь db.collection.createIndex() заменяет db.collection.ensureIndex() также и в оболочке Mongo.
Как видно из https://jira.mongodb.org/browse/JAVA-1097, в Java (о чем спрашивал ОП) ensureIndex() устарело в версии 2.12.0 драйвера Java и DBCollection.createIndex(). DBCollection.ensureIndex() (ссылка до версии 2.12) недоступен в DBCollection Java API больше.
Метод ensureIndex, найденный в драйвере Java (версия 2.12 и старше), будет кэшировать независимо от того, существует ли индекс в коллекции. Поскольку несколько клиентов потенциально могут изменить индексы в коллекции, значение кэша иногда может быть ошибочным, и драйверу не удастся создать отсутствующий индекс.
По этой причине драйвер Java реализовал метод createIndex с идентичным поведением, за исключением того, что он не будет кэшировать статус индекса.
С драйверами 2.12 и выше вы можете заменить ensureIndex на createIndex и ожидать того же поведения, за исключением падения производительности, когда драйвер раньше думал, что индекс уже существует, и возвращался без отправки команды createIndex на сервер mongo.
Почему они не изменили поведение без переименования - я понятия не имею.
Устарело, начиная с версии > 3.0.0: db.collection.ensureIndex() теперь является псевдонимом для db.collection.createIndex().