MongoDB で 指定した範囲のドキュメントだけに件数を絞り込んで取得する 方法

0 件のコメント

今回は「MongoDB で 指定した範囲のドキュメントだけに件数を絞り込んで取得する 方法」についてまとめます。

ページング処理を実装しようとすると特定範囲のデータのみを取得したくなります。 特定範囲のデータのみを MongoDB で取得する場合、 skiplimit という関数ないしオプションを指定することで範囲指定したデータ取得ができます。 今回は「 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 の フォロー」 お願いします!!