1

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

何か案は?ここで実稼働データベースで行ったことを正確に行うことはできず、インデックスを削除して再作成するだけです。

4

1 に答える 1

1

MongoDB は、一度作成されたインデックスの更新をサポートしていません。どこにも文書化されていませんが、既存のインデックスを変更する機能を備えたドライバーはありません。

ドロップ/作成に関する本番環境の問題で、インデックスが配置されていない期間がある場合は、デフォルト以外の名前で新しいインデックスを作成し、作成が完了したら、デフォルトの名前付きバージョンを削除できます。

問題がインデックス作成中のサーバーの負荷である場合は、セカンダリを使用してインデックスを作成する戦略があります。

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

基本的に、レプリカ セットからメンバーを取り出し (--replSet オプションなし、別のポート)、ローカルでインデックスを構築し、元に戻します。次のメンバーを引き出し、ローカルでインデックスを構築し、それを追加し、すすぎ、繰り返します。

于 2013-05-09T02:52:36.147 に答える