ユーザースキーマからランダムなユーザーを返す以下のクエリがあります。
UserSchema.statics.random = function(id,callback) {
this.count(function(err, count) {
if (err) {
return callback(err);
}
var rand = Math.floor(Math.random() * count);
this.findOne()
.where('_id').ne(id)
.where('last_active').gte(new Date(new Date().setDate(new Date().getDate()-3)))
.skip(rand)
.exec(callback);
}.bind(this));
};
ただし、時々返されます-これは、最初にドキュメントをカウントしてからフィルターを適用してドキュメントの数を減らすため、値が使用可能なドキュメントの数よりも大きくなる可能性があるNULL
ためだと思います。rand
これを行うためのより良い方法は何でしょうか?
上記のクエリを実行し、ドキュメントを数えてから、パラメーターを使用して別のクエリを実行し.skip()
ますか?