Разница между createIndex() и sureIndex() в java с использованием mongodb

В чем разница между createIndex() и ensureIndex() в Java с использованием MongoDB? Я гуглил это, но не получил удовлетворительного ответа.


person Amit Chahar    schedule 22.09.2014    source источник
comment
Документация MongoDb на самом деле очень хороша. Ты пробовал?   -  person Jayan    schedule 22.09.2014


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

person sol4me    schedule 22.09.2014
comment
Согласно документам mongodb ensureIndex() устарел. - person KPrince36; 18.03.2015
comment
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 больше.

person Jens Grivolla    schedule 16.10.2014
comment
Кстати, я не могу комментировать неправильный ответ @sol4me из-за отсутствия репутации, ни воскресить мой ошибочно удаленный исходный ответ, ни сделать что-то еще в этом отношении. :-( - person Jens Grivolla; 16.10.2014
comment
Если вы считаете, что правы, опубликуйте хорошо написанный ответ, а не такой бесполезный ответ. Это точно будет удалено. - person Dici; 16.10.2014
comment
Простите, а что бесполезного в моем ответе? Я говорю, что @sol4me ошибся, и в Java API вам действительно нужно использовать createIndex(). Я даже ссылаюсь на соответствующую проблему JIRA, где мне удалось прояснить это с разработчиками MongoDB... Если бы я когда-нибудь получил ответ от тех, кто удалит мой ответ, я бы отредактировал его, а не оставил там все, чтобы показать, как он был удален. . Как бы то ни было, это все крайне враждебно по отношению ко мне, после того, как я даже попытался обсудить вещи с разработчиками, чтобы дать правильный ответ. - person Jens Grivolla; 16.10.2014
comment
Вы цитируете другие комментарии и спорите вместо того, чтобы просто ответить на вопрос. Делайте, как хотите, я просто хотел сказать вам, что такой ответ не может остаться более чем на пару часов. - person Dici; 16.10.2014
comment
Мой правильный ответ был удален дважды, без каких-либо объяснений или какой-либо реакции на мою просьбу о разъяснении, так что да, я серьезно зол, и это видно в репосте моего ответа. Если бы у кого-то хватило порядочности относиться ко мне как к человеку, а не просто удалять мои ответы (в тот момент я никого не цитировал и не спорил), этой ветки бы не существовало. - person Jens Grivolla; 16.10.2014
comment
Теперь я удалил свои комментарии об удалении из ответа. Тем не менее, я по-прежнему считаю крайне неуважительным просто удалить мой правильный ответ без комментариев и без ответа на мои запросы о разъяснении. @bluefeet, почему ты удалил мой пост? Я уже объяснил, что это правильный ответ, все остальные ответы НЕПРАВИЛЬНЫ. Вы могли бы хотя бы ответить, когда я спрошу об этом, вместо того, чтобы снова удалять его и связанные с ним комментарии. На самом деле я указываю на этот вопрос в проблеме MongoDB JIRA, и вы просто продолжаете удалять мой ответ, который является ЕДИНСТВЕННЫМ ПРАВИЛЬНЫМ. - person Jens Grivolla; 16.10.2014
comment
Ты действительно раздражающий. Люди, которые просматривают некачественные ответы и решают удалить их, обрабатывают десятки сообщений в день. Ничего личного против вас нет, и вас, наверное, даже не помнят. Сообщение удаляется только в том случае, если несколько рецензентов сочли это необходимым. Если вы не согласны, вы можете опубликовать его, пытаясь улучшить свой ответ. Если его снова удалят, удивляйтесь, почему ваши ответы систематически удаляются, и перестаньте обвинять других. Если вы не можете изменить свой менталитет, просто не участвуйте в SO, который основан на сотрудничестве и отсутствии конкуренции. - person Dici; 16.10.2014
comment
Хорошо, я думаю, это все. Мой правильный и задокументированный ответ был дважды удален, дважды снижена оценка, в то время как другой ответ, который является полной противоположностью правильного ответа, имеет +3. Ясно, что я мало что могу с этим поделать. Спасибо @Dici хотя бы за ответ. Кстати, я отвечаю здесь, потому что мне не хватает репутации, чтобы перенести обсуждение в чат, как это было предложено SO, и поэтому мой первоначальный ответ не был комментарием к существующему ответу. - person Jens Grivolla; 17.10.2014

Метод ensureIndex, найденный в драйвере Java (версия 2.12 и старше), будет кэшировать независимо от того, существует ли индекс в коллекции. Поскольку несколько клиентов потенциально могут изменить индексы в коллекции, значение кэша иногда может быть ошибочным, и драйверу не удастся создать отсутствующий индекс.

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

С драйверами 2.12 и выше вы можете заменить ensureIndex на createIndex и ожидать того же поведения, за исключением падения производительности, когда драйвер раньше думал, что индекс уже существует, и возвращался без отправки команды createIndex на сервер mongo.

Почему они не изменили поведение без переименования - я понятия не имею.

person GaspardP    schedule 21.10.2015

Устарело, начиная с версии > 3.0.0: db.collection.ensureIndex() теперь является псевдонимом для db.collection.createIndex().

person Surender Singh    schedule 14.07.2018