MongoDB 3.4.9の時点で、観察されたバイアスの理由の一部は、$sample
であるということです。 ストレージエンジンのランダムカーソルの実装にほぼ完全に依存しています( SERVER-19183
を参照) )。これは、$sample
が実行されるように行われます。 コレクションに大量のデータが含まれている場合は、パフォーマンスが向上する可能性があります。ただし、ストレージエンジンは、Bツリータイプの実装を使用して並べ替えられた順序でドキュメントを保存するため、真にランダムな結果を作成できるとは限りません。
現在、より良い$sample
を求める2つの機能リクエストがあります メカニズム、つまり SERVER-22069
および
そうは言っても、データの真に偏りのないサンプルが必要な場合は、独自の$sample
をローリングします。 のような解決策は、この時点で進めるための最良の方法である可能性があります。次のようなもの:
- すべての
_id
のリストを取得する コレクションにあります。 - このリストでランダムサンプリングを実行します(たとえば、Pythonのrandomを使用します.choice 。
- サンプリングされた
_id
を使用して、関連するすべてのドキュメントを取得します 、_id
なので、必要なサンプルサイズに応じて適度にパフォーマンスが向上します。 常にインデックスが付けられます。