2013-05-09 71 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