今回は「MongoDB で 指定した範囲のドキュメントだけに件数を絞り込んで取得する 方法」についてまとめます。
ページング処理を実装しようとすると特定範囲のデータのみを取得したくなります。
特定範囲のデータのみを MongoDB で取得する場合、 skip
と limit
という関数ないしオプションを指定することで範囲指定したデータ取得ができます。
今回は「 find() を利用した方法」と「 aggregate() を利用した方法」の2種類
前提データ
以下のデータを mongo コマンドで投入してある状態で各 fruits について集計を行っていきます。
> 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)
var MongoClient = require("mongodb").MongoClient; var URL = "mongodb://localhost:27017/test"; 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(); }); });
実行 & 結果
> node .\index.js [ { _id: 5a5b09ccf43c88db76c7231c, code: '0201', name: 'banana', price: 180 }, { _id: 5a5b09ccf43c88db76c7231e, code: '0302', name: 'grapefruit', price: 150 } ]
aggregate([ $sort, $skip, $limit ])
得られる結果は同じですが… aggregate() を利用した場合のサンプルコードを記載します。
コード
var MongoClient = require("mongodb").MongoClient; var URL = "mongodb://localhost:27017/test"; 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(); }); });
実行 & 結果
> 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 の フォロー」 お願いします!!