MongoDB で 条件に合致する ドキュメント 件数 を取得する方法

0 件のコメント

今回は「MongoDB で 条件に合致する ドキュメント 件数 を取得する方法」についてまとめます。

集計方法は 「find() + count()」 で行う方法と「aggregate([ $match + $count ])」 で行う方法の2種類が考えられます。 単純に集計するだけであれば「find() + count()」で良いですが、グループ化や統計、コレクションの結合などを含めて実行する場合は「aggregate([ $match + $count ]) 」で行うことになります。

以下ではそれぞれについてサンプルコードを交えながら見ていきます。

前提データ

以下のデータを mongo コマンドで投入してある状態で 2017/12/15 の オーダー総件数 を集計するサンプルコードを見ていきます。

> db.orders.insertMany([
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "pen", amount: 70 },
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "note", amount: 80 },
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "eraser", amount: 100 },
  { datetime: ISODate("2017-11-13T12:00:00+09:00"), item: "pen", amount: 20 },
  { datetime: ISODate("2017-11-02T12:00:00+09:00"), item: "pen", amount: 20 },
  { datetime: ISODate("2017-10-23T12:00:00+09:00"), item: "pen", amount: 30 },
  { datetime: ISODate("2017-10-18T12:00:00+09:00"), item: "pen", amount: 10 }
]);

find() + count() で集計する方法

単独コレクションに対する単純な集計であればこの方法で間に合うと思います。 find() でフィルターされた結果に対して count() で件数取得します。

コード (index.js)

var MongoClient = require("mongodb").MongoClient;
var URL = "mongodb://localhost:27017";

MongoClient.connect(URL, (err, client) => {
  if (err) {
    client.close();
    return;
  }

  var db = client.db("sample");

  db.collection("orders").find({
    datetime: {
      $gte: new Date("2017-12-15T00:00:00+09:00"),
      $lt: new Date("2017-12-16T00:00:00+09:00")
    }
  }).count().then((result) => {
    console.log(result);
    client.close();
  }).catch((err) => {
    console.log(err);
    client.close();
  });
});

実行 & 結果

> node .\index.js
3

aggregate([ $match + $count ]) で集計する方法

以下のサンプルコードでは複雑な集計を行っていませんが、グループ化や特定条件に合致するドキュメントのみ集計するなのなど複雑な集計処理を行う場合は aggregate() を利用します。

$match に指定する条件式は find() + count() で行ったものと同じになります。 得られる結果形式が find() + count() の形とは異なるので注意です。

コード (index.js)

var MongoClient = require("mongodb").MongoClient;
var URL = "mongodb://localhost:27017";

MongoClient.connect(URL, (err, client) => {
  if (err) {
    client.close();
    return;
  }

  var db = client.db("sample");

  db.collection("orders").aggregate([
    {
      $match: {
        datetime: {
          $gte: new Date("2017-12-15T00:00:00+09:00"),
          $lt: new Date("2017-12-16T00:00:00+09:00")
        }
      }
    },
    { $count: "total" }
  ]).toArray().then((result) => {
    console.log(result);
    client.close();
  }).catch((err) => {
    console.log(err);
    client.close();
  });
});

実行 & 結果

> node .\index.js
[ { total: 3 } ]

今回は「MongoDB で 条件に合致する ドキュメント 件数 を取得する方法」についてまとめました。 ポイントは以下の通りです。

  • 単純な集計なら find() + count()
  • 複雑な集計になりそうなら aggregate()

参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!