2012-02-24 10 views
1

私はそれに約500000個のデータセットを持つコレクションを持っており、その中からランダムなデータセットを見つけるのが好きです。 find()をcustomer-idに制限することができます。これにより、サイズが約80000セットに縮小されます。また、顧客IDに指標が追加されます。MongoDBランダムデータセットのパフォーマンスを見つけよう

私は、ランダムなデータセットを取得するには、次のコマンドを使用してPHPで

$mongoCursor = $mongoCollection->find($arrQuery, $arrFields)->skip(rand(1, $dataCount)); 

プロファイラは今、伝え:

DB.Collection ntoskip:3224 nscanned:3326 nreturned:101 reslen:77979 262ms 

これは、結果を取得するためにかなりの時間を要します。 データを取得するより良い方法はありますか?

PHPですべてのIDを取得した後、ランダムに1つのIDを取得し、このIDの完全なセットを見つけることを考えました。しかし、私はPHPで非常に多くのデータを取得することについて心配しています。

ありがとうございました。 Dan

+0

* *一度のための十分な需要があるより良い方法かもしれない...(HTTPS [コレクションからランダムにアイテムを取得するための機能要求]はあります。 mongodb。org/browse/SERVER-533)をMongoDBチケットトラッカーに追加します。ネイティブに実装されている場合は、最も効率的なオプションになる可能性があります。 (機能が必要な場合は、それを投票してください) –

+0

この質問は、ここでスタックオーバーフローの多くのフォームで要求されています。最も一般的な質問は[MongoDBのランダムレコード](http://stackoverflow.com/questions/2824157/random-record-from-mongodb)です。これは良い回答です。しかし、私は、この問題についての最善の考え方は、ランダムな文書を1つ取得することを考えるのではなく、むしろ結果セットをランダム化することだと思います。それについては、[Mongoでランダムに結果セットを注文する](http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo)を参照してください。 –

答えて

0

こんにちは私はランダムな問題に複数のソリューションを試しました。 カーソルを使用してランダムな位置に移動しましたが、これは極端に遅かったです。 次に、完全なデータセットを使用してランダムな項目を選択しましたが、これは問題ありませんでした。

私にとって最高のパフォーマンスソリューションは、ランダムな数字を選んで最小値と最大値を取り、使用してデータベースを照会することでした:

db.collection.find({...}).skip(min).limit(max-min); 

をそれから私はちょうど結果throught一回反復し、私から始まるインデックスを比較します=分;私は+ +;ランダムセット内の数字と一致するアイテムだけを取ります。私にとっては、minとmaxの面積をランダムに制限することは大丈夫でした。私は、ログサイズに応じてmin-maxウィンドウのサイズを選択するために対数アプローチを使用しました。

結果はランダムな結果セットを選択する非常に高速な方法です。

これは誰かにも役立つことを期待しています。 // JIRA:

---ダンあり

2

探しているドキュメントに到達するまでMongoが結果セット内を移動するのをスキップするので、そのクエリの結果セットが大きければ長いほど、それは長くなります。

このユースケースに本当に必要なのは、文書をランダムに照会する方法であり、ランダムに照会するものではありません。各文書にインクリメンタルな識別子を与えてから、その既知の範囲のIDで見つかった番号をランダムに選択することもできますが、多くの文書を削除するか、可能な一致をフィルタリングするクエリを適用する必要がある場合は、まばらに人口が多くなり、結果を見つけるのにさらに時間がかかる可能性があります。あなたのデータと使い方によって異なります。

この方法は、データと使用のために動作しない場合は、あなたもここで説明する方法を試みることができる:http://cookbook.mongodb.org/patterns/random-attribute/

を一番下の行は、それは本当にために起こっているので、モンゴは、あなたのためにこれをしないということですデータ内の文書をランダムに識別する方法を理解する必要があります。

関連する問題