1. ホーム
  2. mongodb

[解決済み] Mongoose のリミット/オフセットとカウントクエリ

2023-01-06 12:16:53

質問

クエリのパフォーマンスに関する少し変わったもの... 私はドキュメントの総カウントを行うクエリを実行する必要があり、また、制限およびオフセットすることができる結果セットを返すことができます。

私は合計で57のドキュメントを持っており、ユーザーは10のドキュメントを20でオフセットすることを望んでいます。

1つ目は57のドキュメントをすべて問い合わせ(配列として返されます)、それからarray.sliceを使ってユーザーが望むドキュメントを返します。2つ目の方法は、2つのクエリを実行することです。1つ目は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});
    });
});

どのように解決するのですか?

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

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

  2. db.collection.find().skip(20).limit(10) ここでは、あるフィールドでソートすることを想定しているので、このフィールドにインデックスを追加することを忘れないでください。このクエリも高速になります。

ビッグデータになってくると、データの転送や処理の問題が出てくるので、全項目をクエリして、skip and takeはしない方がいいと思います。