2011-12-14 10 views

答えて

27

短い回答:はい。

インデックスがコレクションドロップにドロップしています。索引を再作成する必要があります。

コレクションを削除しないで、コレクション内のすべてのアイテムを削除することをお勧めします。db.collection_name.remove({})より多くのリソースが必要になりますが、インデックスは残しておきます。実際には、すべてのインデックスデータを削除する必要があります。そのため、コレクション全体を削除し、その後にインデックスを再作成することがより好ましい理由です。

+1

空のコレクションにインデックスを作成できますか? – raffian

+1

はいできます。コレクションは、インデックスを作成するときに作成されます。 –

+1

'大きなコレクションで' remove() 'に時間がかかることがあります。 'drop()'ははるかに高速ですが、既に指摘したように、すべてのインデックスを削除するという欠点があります。 – dcrosta

1

コレクションを削除すると、すべてのインデックスが削除される可能性があります。コレクションを再作成するときは、明示的にまたは暗黙的に新しいドキュメントを追加する必要があります。 _idのデフォルトのインデックスが自動的に作成されます。

+1

インデックスがすでに存在する場合、同じコレクションに対してensureIndex()を複数回呼び出すことに何らかの害があることは理解できますか? – raffian

+0

害がありません。マイナーなパフォーマンスのインパクトは、あなたが保証しようとしているインデックスが既に存在するかどうかを確認するために影響します。 –

7

私は、これを10個のインデックスを持つコレクションで行いましたが、手動で再作成する必要はありませんでした。ドロップを達成し、モンゴシェルで、次の3行のインデックスを再作成することができます。

var indexes = db.collection.getIndexKeys().splice(1) 
db.collection.drop(); 
indexes.forEach(function(el){ db.collection.ensureIndex(el, {background:true}); }) 

これは、ユニークまたはスパースインデックスを処理するのに十分スマートではないですが、私はそれが使用してサポートすることはかなり簡単だろうと思います代わりにgetIndexes()の出力私はそれが必要ではなかったので、私はそれをしなかった。

splice(1)は、_idのインデックスを削除するだけです。自動的に作成されるためです。

+0

多くのありがたいですが、 '{background:true}'はインデックスを消去しました。 –

関連する問題