2013-05-09 34 views
1

我使用pymongo並希望將索引從唯一更新爲唯一且稀疏。 ensure_indexcreate_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 所以,你可以刪除輔助索引,並建立與稀疏真正的相同。這應該很好。 – 2013-05-09 02:42:34

回答

1

MongoDB不支持一旦創建就更新索引。我無法在任何地方找到記錄,但沒有一個驅動程序能夠改變現有索引。

如果使用drop/create生產的問題存在一段時間而沒有適當的索引,那麼您可以使用非默認名稱創建新索引,並且一旦完成創建,將刪除名爲default版。

如果問題是服務器上的負載,同時創建索引有創建使用索引次級的策略:

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

基本上你拉一個成員出副本集(無 - -replSet選項,不同的端口),在本地構建索引,將其恢復。拉出下一個成員,在本地建立索引,將其添加回去,沖洗並重復。

+0

好主意。從實驗來看,它看起來像mongo也不在乎是否有不同的名字。但是,如果我只是降序創建原始索引,然後刪除原始索引並使用sparse = true重新創建索引,然後刪除臨時索引,那麼它的確行得通。 – danny 2013-05-09 03:00:48