更新pymongo中的现有索引

时间:2013-05-09 02:32:36

标签: mongodb pymongo

我正在使用pymongo并希望将索引从唯一更新为唯一且稀疏。 ensure_indexcreate_index似乎都不想更新已存在的索引。我正在运行mongo 2.2.0

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}}

有什么想法吗?我不能完全按照我在生产数据库中所做的那样做,只需删除索引并重新创建它。

1 个答案:

答案 0 :(得分:1)

MongoDB不支持在创建后更新索引。我无法在任何地方找到记录,但没有一个驱动程序能够改变现有索引。

如果使用drop / create进行生产的问题是在没有索引的情况下有一段时间,那么可以使用非默认名称创建新索引,并在完成创建后删除默认的命名版本

如果问题是在创建索引时服务器上的负载,则存在使用辅助节点创建索引的策略:

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

基本上你将一个成员拉出副本集(没有--replSet选项,不同的端口),在本地构建索引,然后将其恢复。拉出下一个成员,在本地构建索引,将其添加回来,冲洗,重复。