在MySQL中,可以通过下面的语句简单的获取随机的5条记录:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,没有找到rand()方法,而且ObjectID也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?
rand()
ObjectID
人生最曼妙的风景,竟是内心的淡定与从容!
実際にこの機能を追加するかどうかについては議論されています: https://jira.mongodb.org/browse/SERVE... ですが、現時点では実質的な進展はないようです。
実際、MySQL は一時テーブルを作成し、すべての候補行に対して乱数を生成し、その乱数をソートして必要な結果を取得するだけです。
MongoDB では、ドキュメントのソート属性を自分で構築する必要があります。この属性の値は、クックブックから取得した乱数にすることができます。 リーリー
ソート属性の値は MySQL のように動的ではないため、複数のドキュメントを本当にランダムに取得したい場合は、上記の操作をループする必要があります。
つまり、実際には、重複する値が多すぎずに上限値と下限値を見つけることができるタイムスタンプもランダムな並べ替えに使用できます。
条件を追加します "$where":function () { if(Math.random()>0.1){return true;}else{return false;}} 制限(1)と併用 セットから 1/10 の確率でレコードをランダムに選択します 簡単かもしれませんが、その用途はより限定されます。参考までに〜
実際にこの機能を追加するかどうかについては議論されています: https://jira.mongodb.org/browse/SERVE... ですが、現時点では実質的な進展はないようです。
実際、MySQL は一時テーブルを作成し、すべての候補行に対して乱数を生成し、その乱数をソートして必要な結果を取得するだけです。
MongoDB では、ドキュメントのソート属性を自分で構築する必要があります。この属性の値は、クックブックから取得した乱数にすることができます。 リーリー
検索するときは、乱数を計算し、並べ替え属性でそれに最も近い値を見つけます。ただし、並べ替え属性にインデックスを追加することを忘れないでください。 リーリーソート属性の値は MySQL のように動的ではないため、複数のドキュメントを本当にランダムに取得したい場合は、上記の操作をループする必要があります。
この問題の根本は、数学的な意味でのランダム性が必要かどうかだと思います。大まかなアイデアだけを知りたい場合は、インデックスを付けずに大量のデータに対して Map/Reduce を使用して収束速度を向上させることができます。つまり、実際には、重複する値が多すぎずに上限値と下限値を見つけることができるタイムスタンプもランダムな並べ替えに使用できます。
条件を追加します
"$where":function () { if(Math.random()>0.1){return true;}else{return false;}}
制限(1)と併用
セットから 1/10 の確率でレコードをランダムに選択します
簡単かもしれませんが、その用途はより限定されます。参考までに〜