ランダム レコード選択が実際にはMongoDB でまだサポートされていないことは知っていますが、それを回避する方法をいくつか見つけました。
ただし、加重ランダムアイテムを選択したい。これはmySqlではかなり簡単ですが、Mongo でこれを行う最善の方法はわかりません。
私が解決している問題は次のとおりです。懸賞エントリを保持するコレクションがあり、ユーザーがコンテストを共有/宣伝する回数に基づいて、「追加のエントリ」を取得して、勝つ可能性を高めます。ユーザーのエントリを複製するのではなく、コンテストを共有した回数を記録するフィールドがあります。この数値を乗数として使用して、「勝者」のランダムな選択に重みを付けたいと思います。
ここに私が考えたいくつかのアプローチがあります:
- クックブックのランダム選択方法のバリエーションを使用して、乱数の配列(乗数に等しい) を生成し、レコードがクエリされたランダム ポイントの近くにある可能性を高めます (ただし、Mongo は配列 [マルチキー] インデックスをサポートしていません。はい? だから遅くなるかもしれません)
- 単純な乱数の代わりに、乗数に等しい半径の丸い多角形を使用して、地理空間クエリを使用するクックブック ランダム メソッドの別のバリエーション (これが可能であるとしても、MongoDB ジオ インデックスとクエリを使用したことはありません)。
- 新しい一時コレクションでエントリを展開し、MongoDB のランダム選択方法のいずれかを使用します
- 問題を回避し、最初に重複したエントリをMongoに保存し、通常のランダム選択thingamajigを実行します
- MongoID とその重み乗数の個別のインデックスを mySql に保持し (常に同期されるか、オンデマンドで生成されます)、mySql を使用してランダムに重み付けされた選択を行います。
- 巨大な配列をクエリして PHP で実行し、メモリ不足にならないことを願っています! :/
私はここで何かに取り組んでいますか?私が見逃している明らかな解決策について、他の提案はありますか?何が機能するかを確認するために実験を行うつもりですが、最初のアイデアに対するフィードバックは大歓迎です!!
これらのコンテストはおそらく何百万ものエントリ (通常は [数万] のようなもの)を持つことはないため、パフォーマンスは「良い」ものである必要があります。そのため、速度よりも公平性/正確性が重要です。ありがとう。