98

クエリのパフォーマンスに関して少し奇妙なことです...ドキュメントの総数を実行し、制限およびオフセットできる結果セットを返すこともできるクエリを実行する必要があります。

したがって、合計57のドキュメントがあり、ユーザーは10のドキュメントを20でオフセットしたいと考えています。

これを行うには2つの方法が考えられます。最初は、57個のドキュメントすべて(配列として返される)をクエリし、次にarray.sliceを使用して必要なドキュメントを返します。2番目のオプションは、2つのクエリを実行することです。最初のクエリはmongoのネイティブの'count'メソッドを使用し、次にmongoのネイティブの$limitおよび$skipアグリゲーターを使用して2番目のクエリを実行します。

どちらがより適切にスケーリングすると思いますか?すべてを1つのクエリで実行しますか、それとも2つの別々のクエリを実行しますか?

編集:

// 1 query
var limit = 10;
var offset = 20;

Animals.find({}, function (err, animals) {
    if (err) {
        return next(err);
    }

    res.send({count: animals.length, animals: animals.slice(offset, limit + offset)});
});


// 2 queries
Animals.find({}, {limit:10, skip:20} function (err, animals) {            
    if (err) {
        return next(err);
    }

    Animals.count({}, function (err, count) {
        if (err) {
            return next(err);
        }

        res.send({count: count, animals: animals});
    });
});
4

7 に答える 7

156

2 つのクエリを使用することをお勧めします。

  1. db.collection.count()アイテムの総数を返します。この値は Mongo のどこかに保存され、計算されません。

  2. db.collection.find().skip(20).limit(10)ここでは、いくつかのフィールドで並べ替えを使用できると想定しているため、このフィールドにインデックスを追加することを忘れないでください。このクエリも高速になります。

すべてのアイテムをクエリしてからスキップして取得するのではなく、後で大きなデータがあると、データの転送と処理に問題が発生する可能性があると思います。

于 2013-03-13T14:02:20.493 に答える