56

ピモンゴのcreate_indexとの違いがわかりません。MongoDBensure_indexのインデックス ページには、次のように書かれています。

を呼び出してインデックスを作成できます。 ensureIndex()

ただし、pymongo には 2 つの異なるコマンドcreate_indexensure_indexがあり、create index のドキュメントには次のように記載されています。

無条件にインデックスを作成しようとする create_index() とは異なり、ensure_index() はドライバー内のキャッシュを利用して、まだ存在しない可能性のあるインデックスのみを作成しようとします。インデックスが PyMongo によって作成 (または保証) されると、ttl 秒間「記憶」されます。その制限時間内に ensure_index() を繰り返し呼び出すと軽量になります。実際にインデックスを作成しようとはしません。

ensure_index永続的なインデックスを作成することを理解していますか、それともcreate_indexこれを使用する必要がありますか?

4

6 に答える 6

40

@andreas-jung は、それensure_index()がラッパーであるという点で正しいですcreate_index()。次のフレーズで混乱が生じると思います。

インデックスが PyMongo によって作成 (または保証) されると、ttl 秒間「記憶」されます。

インデックスが一時的または「一時的」であるということではありません。指定された秒数の間、ensure_index()同じインデックスを再度作成しようとする呼び出しは何の効果もなく、その下では呼び出されませcreate_index()、その後は「キャッシュ」されます。が期限切れにensure_index() なるcreate_index()と、 への呼び出しはその下で再び呼び出されます。

率直に言って、PyMongo のドキュメントはこれがどのように機能するかを説明するのにあまり適していないため、あなたの混乱は完全に理解できますが、Ruby docsに向かうと、説明が少し明確になります。

  • (文字列) ensure_index(spec, opts = {})

create_index を呼び出し、フラグを設定して、さらに X 分間それを行わないようにします。この時間は、Mongo::DB オブジェクトを options[:cache_time] として初期化するときにオプションとして指定できます。インデックスへの変更は、キャッシュ時間に関係なく反映されます (インデックスの方向の変更など)。

このメソッドのパラメーターとオプションは、Collection#create_index と同じです。

例:

Call sequence:

Time t: @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and sets the 5 minute cache

Time t+2min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- doesn't do anything

Time t+3min : @posts.ensure_index([['something_else', Mongo::ASCENDING]) -- calls create_index and sets 5 minute cache

Time t+10min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and resets the 5 minute counter

ドライバーがまったく同じように機能すると主張しているわけではありません。説明のために、説明が少し良くなっているだけです。

于 2011-05-06T16:35:37.933 に答える
21

Mongo 3.x では、ensureIndexは非推奨であり、推奨されないことに注意してください。

バージョン 3.0.0 以降非推奨: db.collection.ensureIndex() は db.collection.createIndex() のエイリアスになりました。

同じことがpymongoにあります:

非推奨 - このコレクションにインデックスが存在することを確認します。

つまり、常に使用する必要がありますcreate_index

于 2015-05-19T00:38:36.107 に答える
3

すべてのインデックスは永続的です。ensure_index() は create_index() の小さなラッパーです。

""" ensureIndex() 関数は、存在しない場合にのみインデックスを作成します。 """

一時インデックスや一時インデックスのようなものはありません。

于 2011-05-06T14:20:55.300 に答える
-1

メタクラスと ORM を作成することをお勧めします。メタクラスのinitから、カウンター、スキーマ、キーなどを初期化するための init_schema メソッドを呼び出します。このようにして、クエリまたはコレクションの更新ごとに ensure_index を呼び出さないようにします :)

于 2013-02-03T18:45:26.183 に答える