2013-05-09 3 views
1

Я использую pymongo и хочу обновить индекс от того, чтобы быть уникальным и уникальным. Оба ensure_index и create_index, похоже, не хотят обновлять уже существующий индекс. Я управляюсь mongo 2.2.0Обновление существующего индекса в pymongo

In [1]: coll.index_information() 
Out[1]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'unique': True, u'v': 1}} 

In [2]: coll.ensure_index([('foo', 1)], unique=True, sparse=True) 

In [3]: coll.index_information() 
Out[3]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'unique': True, u'v': 1}} 

In [4]: coll.drop_index('foo_1') 

In [5]: coll.ensure_index([('foo', 1)], unique=True, sparse=True) 
Out[5]: u'foo_1' 

In [6]: coll.index_information() 
Out[6]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'sparse': True, u'unique': True, u'v': 1}} 

Любые идеи? Я не могу точно сделать то, что я сделал здесь, в производственной базе данных, и просто отбросить индекс и заново создать его.

+0

Если альтернатив нет, и вы используете реплика или осколок в процессе производства, вы можете рассмотреть возможность создания с помощью: http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/ #procedure Итак, вы можете отбросить индекс на вторичном и построить то же самое с разреженным истинным. Это должно работать нормально. –

ответ

1

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

Если проблема с производством с функцией drop/create имеет период времени без индекса, то вы можете создать новый индекс с именем, отличным от значения по умолчанию, и как только оно будет завершено, запустите значение по умолчанию с именем версия.

Если проблема нагрузки на серверах при создании индекса есть стратегия для создания индекса с помощью секондари:

http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/#procedure

В основном вы тянете элемент из набора реплик (нет - -replSet, другой порт), создайте индекс локально, верните его. Вытяните следующий элемент, создайте индекс локально, добавьте его назад, промойте, повторите.

+0

Хорошая идея. Из экспериментов это похоже на монго, также неважно, есть ли другое имя. Но он работает, если я создаю исходный индекс только по убыванию, затем отмените исходный индекс и заново создайте его с sparse = true, а затем отмените временный индекс. – danny

Смежные вопросы