2012-04-04 9 views
0

バグでmongoコレクションを照会する最も効率的な方法は何ですか?私はhereバッチクエリの等価Mongodbイディオム

概説が、スキップに関する大きな警告は、私はそれを使用してはならないと思わせるように私が何かを行うことができますことを発見しました

SELECT * FROM Foo WHERE id > {{floor}} limit 1000; 

:SQLでたとえば私のような何かをしたいです。 (コレクションのサイズが十分に大きいと仮定します)。

マイコレクションには、自動生成された_idフィールド以外にインデックスがありません。それと$ gt $ ltを使用する方法があるかどうかはわかりません。

それが重要ならば、私はカスバドライバを使用することがありますが、場合に建てられた秘密のソースがあります。

答えて

2

モンゴするために、そのSQLクエリの直訳は

db.foo.find({"id": {"$gt": floor}}).limit(1000) 

このクエリ缶ですidフィールドのインデックス(またはidという名前の列の代わりにその列を使用する場合は、デフォルトのインデックス_id)を使用できます。

limit()のパフォーマンスに問題はありませんが、結果が返される前にサーバーが多くのレコードを繰り返し処理する必要があるため、非常に大きな値の場合はskip()がパフォーマンスが低下する可能性があります。

+0

私は_idのデフォルトインデックスしか持っていないので、開始する最小IDはわかりません。しかし、私が0で始まって1000を制限し、そして最後の_idを取ってそれを増やしたら、それはうまくいくと思います...そうですか? –

+0

実際、私はdb.foo.find({_id:{$ gt:new ObjectId( "00000000000000000000000000")}}).limit(1000)のようなことをすることができます。ニース。 –

+1

ページめくりのためには、そのアプローチ(最後を覚えておき、その直後から開始すること)をお勧めします。 'db.foo.find({_ id:{$ gt:{last_object_id}})。sort({_ id:1})。limit(num_per_page)'を実行することができます。 Rembmerは 'sort()'を使うべきです。さもなければあなたは奇妙な結果を得るでしょう。 – dcrosta