Метод ensureIndex
в Interactive Shell и ensure_index
в драйвере питона - разные вещи, хотя используется одно и то же слово.И метод create_index
, и ensure_index
из драйвера python постоянно создают индекс.
Возможно, в такой ситуации можно использовать ensure_index
с приемлемым TTL, потому что я не уверен, что create_index
будет воссоздавать индекс каждый раз, когда вы вызываете его.Отдых обычно не желателен, и это может быть тяжелой операцией.Но даже ensure_index
(из драйвера python или драйвера ruby) может воссоздать индекс всякий раз, когда истекает TTL, или когда вы вызываете его из другого экземпляра клиента или после перезапуска.Я не уверен в этом.
Возможно, еще лучшая возможность - сначала проверить, используя метод index_information()
, если индекс уже существует.Если он уже существует, вы бы не создали его снова.
Сейчас я демонстрирую, как термин ensure_index
(или ensureIndex
) используется в двух разных значениях:
1) Он создает индекс, если он еще не существует в базе данных
Это то, что Interactive Shell метод ensureIndex()
делает:
http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics
Также Node.JS MongoDB Driver
ведет себя так:
https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js
(Поиск function ensureIndex
в файле collection.js
.)
2) Он создает индекс, если его нет в «кэше драйверов»
Этот же идентификатор используется здесь с другим значением, что я нахожу запутанным.
Питон и драйвер ruby хранят в памяти информацию об индексах, которые были созданы недавно, и они называют это поведение «кэшированием».
Они не сообщают базе данных об этом кешировании.
Результат этого механизма: если вы в первый раз вызываете create_index
или ensure_index
со значением TTL (время жизни), драйвер вставит индекс в базу данных и запомнитэта вставка, а также хранить информацию TTL в памяти.Здесь кешируется время и индекс, в котором оно было.
При следующем вызове ensure_index
с тем же индексом из той же коллекции в том же экземпляре драйвера команда ensure_index
вставит толькоПовторите индексирование, если TTL-секунды еще не прошли с момента первого вызова.
Если вы наберете create_index
, индекс будет вставлен всегда, независимо от того, сколько времени прошло с момента первого вызова, и, конечно, такжеесли это первый вызов.
Это драйвер python, найдите def ensure_index
в файле collection.py
:
https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py
И драйвер ruby, найдите def ensure_index
в файле collection.rb
:
https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb
(Обратите внимание, что разные клиентские экземпляры не знают о кэшировании других, эта информация хранится в памятитолько для каждого экземпляра. Если вы перезапустите клиентское приложение, новый экземпляр не будет знать о старых «кэшированных» индексных вставках. Также другие клиенты не знают, они не сообщают друг другу.)
Iбыл еще не в состоянии полностьюпонять, что происходит в БД, когда драйвер python или драйвер ruby вставляют индекс, который уже существует.Я подозреваю, что в этом случае они ничего не делают, что имеет больше смысла, а также соответствует поведению Interactive Shell
и драйвера JS.