2011-11-09 11 views
7

ランダムにコレクションからドキュメントを選択する必要があります(または、ランダムに配置された「ウィンドウ」から少数の連続したドキュメント)。 私は2つのソリューションを見つけました:12私は大きなコレクションのサイズを予想し、ドキュメントのサイズを最小限に抑えたいので、最初は受け入れられません。 2番目は効果がないようです(私はskip操作の複雑さについてはわかりません)。そしてhere指定されたインデックスを持つドキュメントをクエリすることについての記述がありますが、私はそれを行う方法がわかりません(私はC++ドライバを使用しています)。MongoDB:単一のランダム文書を照会する最も効率的な方法は何ですか?

他の解決策がありますか?どちらが最も効率的ですか?

+0

MongoDBチケットトラッカーに[コレクションからランダムなアイテムを取得する機能リクエスト](https://jira.mongodb.org/browse/SERVER-533)があります。ネイティブに実装されている場合は、最も効率的なオプションになる可能性があります。 (機能が必要な場合は、投票してください) –

+1

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

答えて

2

を私はかつて同様の問題がありました。私の場合、私は自分の書類に日付のプロパティを持っていました。データセットで可能な限り早い日付を知っていましたので、アプリケーションコードでは、EARLIEST_DATE_IN_SETとNOWの範囲内でランダムな日付を生成し、dateプロパティのGTEクエリを使用してmongodbをクエリし、単純に1結果に制限します。

ランダムな日付がデータセットの最高の日付よりも小さい可能性があります。そのため、アプリケーションコードではランダムな日付が占めています。

日付プロパティのインデックスを使用すると、これは超高速クエリでした。

+0

ありがとう、私はこのオプションを使いました。私はちょうど私のアプリケーションをプロファイリングしている、と私はMongoのアクセスをすべてのあなたの方法でランダムに文書を選ぶほど速くありたい:) –

2

解決策1を(あなたの_idキーがauto-inc値だったと仮定して)モールドできたようですが、あなたのレコードをカウントして、それをC++のランダムintの上限として使用すると、その行をつかむ。

同様に、autoinc _idキーがない場合は、結果を使用してキーを作成してください。INTを使用してフィールドを追加すると、ドキュメントのサイズにその値を追加しないでください。

あなたはすぐにここに1を追加する方法については、自動株式会社フィールドモンゴ交渉していない場合:

Auto Inc Field.

+0

autoincidがあるかどうかわかりません。私はそれを避けることを望んでいた。私の文書はIDフィールドを持っています。新しい文書を挿入するたびにそのフィールドの 'ensureIndex'を行っています。私はモンゴーでは新しく、本当に分からない。 –

+0

一致するインデックスではなく、指定したインデックスに最も近いインデックスでドキュメントをクエリできますか?それはインデックスによる通常のクエリと同じくらい速くなければならず、それが私の問題を解決します。 –

+0

MongoのIDのものは、デフォルトのMongoID(生成する)を使用している場合、BSONのObject model:http://www.mongodb.org/display/DOCS/Object+IDsを使用しているということです。ただし、最初の文書作成時に独自の_idを作成することで、これをオーバーライドすることができます。これらは常に一意であることを確認するだけです。 – Petrogad

関連する問題