今回は「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 の フォロー」 お願いします!!