27

Schema.statics.randomコレクションからランダムな要素を取得する関数を作成したいと思います。ネイティブのMongoDBドライバーの例があることは知っていますが、Mongooseで動作させることができません。

4

10 に答える 10

40

GitHub Gist でこの Mongoose Schema static function を見つけました。これにより、目的が達成されるはずです。コレクション内のドキュメントの数をカウントし、ランダムな量をスキップした後、1 つのドキュメントを返します。

QuoteSchema.statics.random = function(callback) {
  this.count(function(err, count) {
    if (err) {
      return callback(err);
    }
    var rand = Math.floor(Math.random() * count);
    this.findOne().skip(rand).exec(callback);
  }.bind(this));
};

ソース: https://gist.github.com/3453567

注:コードを少し変更して、読みやすくしました。

于 2013-02-01T11:05:08.017 に答える
22

「テストのような」コードをスキーマに追加したくない場合は、Mongoose クエリを使用します。

Model.count().exec(function(err, count){

  var random = Math.floor(Math.random() * count);

  Model.findOne().skip(random).exec(
    function (err, result) {

      // result is random 

  });

});
于 2015-02-04T20:59:31.133 に答える
3

非同期/待機、約束などの時にこれを見ている人のために:

MySchema.statics.random = async function() {
  const count = await this.count();
  const rand = Math.floor(Math.random() * count);
  const randomDoc = await this.findOne().skip(rand);
  return randomDoc;
};
于 2018-04-10T21:21:23.317 に答える