今回は「MongoDB で 指定した範囲のドキュメントだけに件数を絞り込んで取得する 方法」についてまとめます。
ページング処理を実装しようとすると特定範囲のデータのみを取得したくなります。
特定範囲のデータのみを MongoDB で取得する場合、 skip
と limit
という関数ないしオプションを指定することで範囲指定したデータ取得ができます。
今回は「 find() を利用した方法」と「 aggregate() を利用した方法」の2種類
前提データ
以下のデータを mongo コマンドで投入してある状態で各 fruits について集計を行っていきます。
1 2 3 4 5 6 7 8 | > db.fruits.insertMany([ { code: "0101" , name: "apple" , price: 120 }, { code: "0201" , name: "banana" , price: 180 }, { code: "0301" , name: "orange" , price: 130 }, { code: "0302" , name: "grapefruit" , price: 150 }, { code: "0401" , name: "persimmon" , price: 100 }, { code: "0102" , name: "pear" , price: 130 }, ]); |
find()
以下のコードは MongoDB Node.js Driver 3.0 でのサンプルコードになります。 3.0 の場合は find() のオプションでソート、スキップ、リミットを指定できます。 2.2 の場合は、 find() の後に sort() → skip() → limit() と呼び出せば同じ結果が得られます。
コードでは skip: 1
limit: 2
(1件飛ばして2件取得)となっています。
つまり、2件目と3件目を取得してくるような実装となっています。
ページング処理を実装するのであれば skip: <(ページ番号-1) × 1ページの表示件数>
、 limit: <1ページの表示件数>
と指定することで実現できます。
コード (index.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var MongoClient = require( "mongodb" ).MongoClient; MongoClient.connect(URL, (err, client) => { var db = client.db( "test" ); db.collection( "fruits" ) .find({}, { sort: { name: 1 }, skip: 1, limit: 2 }) .toArray() .then((docs) => { console.log(docs); }) . catch ((err) => { console.log(err); }) .then(() => { client.close(); }); }); |
実行 & 結果
1 2 3 4 5 6 7 8 9 | > node .\index.js [ { _id: 5a5b09ccf43c88db76c7231c, code: '0201' , name: 'banana' , price: 180 }, { _id: 5a5b09ccf43c88db76c7231e, code: '0302' , name: 'grapefruit' , price: 150 } ] |
aggregate([ $sort, $skip, $limit ])
得られる結果は同じですが… aggregate() を利用した場合のサンプルコードを記載します。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var MongoClient = require( "mongodb" ).MongoClient; MongoClient.connect(URL, (err, client) => { var db = client.db( "test" ); db.collection( "fruits" ).aggregate([ { $sort: { name: 1 } }, { $skip: 1 }, { $limit: 2 } ]).toArray() .then((docs) => { console.log(docs); }) . catch ((err) => { console.log(err); }) .then(() => { client.close(); }); }); |
実行 & 結果
1 2 3 4 5 6 7 8 9 | > node .\index.js [ { _id: 5a5b09ccf43c88db76c7231c, code: '0201' , name: 'banana' , price: 180 }, { _id: 5a5b09ccf43c88db76c7231e, code: '0302' , name: 'grapefruit' , price: 150 } ] |
今回は「MongoDB で 指定した範囲のドキュメントだけに件数を絞り込んで取得する 方法」についてまとめました。 ポイントは以下の通りです。
- find() なら オプションで sort, skip, limit 指定
- aggregate() なら $sort, $skip, $limit ステージ指定
参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!