MongoDBで一意な値(distinct)の件数をカウントする方法
MongoDBで特定フィールドに含まれる一意な値(重複を除いた値)がいくつあるかを調べたい場合、distinct()メソッドとJavaScriptのlengthプロパティを組み合わせるのが最もシンプルで分かりやすい方法です。
distinct()メソッドは指定したフィールドの重複しない値を配列として返すため、その配列の長さ(length)を取得することで、一意な値の件数を簡単に求められます。
基本構文
一意な値をカウントするための基本的な構文は以下のとおりです。
db.yourCollectionName.distinct("yourFieldName").length;
サンプルコレクションの作成
まず、動作を確認するためにドキュメントを含むコレクションを作成しましょう。ここでは学生名(StudentName)フィールドを持つドキュメントを複数件挿入し、意図的に同じ名前が重複するようにしています。
> db.countDistinctDemo.insertOne({"StudentName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd6166de8cc557214c0dfa")
}
> db.countDistinctDemo.insertOne({"StudentName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd616ade8cc557214c0dfb")
}
> db.countDistinctDemo.insertOne({"StudentName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd616cde8cc557214c0dfc")
}
> db.countDistinctDemo.insertOne({"StudentName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd6170de8cc557214c0dfd")
}
> db.countDistinctDemo.insertOne({"StudentName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd6175de8cc557214c0dfe")
}
> db.countDistinctDemo.insertOne({"StudentName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd6181de8cc557214c0dff")
}
登録されたドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.countDistinctDemo.find().pretty();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5cbd6166de8cc557214c0dfa"), "StudentName" : "John" }
{ "_id" : ObjectId("5cbd616ade8cc557214c0dfb"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5cbd616cde8cc557214c0dfc"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5cbd6170de8cc557214c0dfd"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5cbd6175de8cc557214c0dfe"), "StudentName" : "David" }
{ "_id" : ObjectId("5cbd6181de8cc557214c0dff"), "StudentName" : "Carol" }
全部で6件のドキュメントがありますが、名前を見ると「Chris」と「Carol」がそれぞれ2回ずつ登場しているため、一意な名前は「John」「Chris」「Carol」「David」の4種類です。
一意な値の件数をカウントするクエリ
それでは、実際に一意な値をカウントしてみましょう。distinct()メソッドにフィールド名を渡し、その結果に対して.lengthを指定します。
> db.countDistinctDemo.distinct("StudentName").length;
実行結果は以下のとおりです。
4
期待どおり、重複を除いた「4」という結果が返されました。このように、distinct().lengthを使えば、たった1行のコードで一意な値の件数を手軽に取得できます。
補足:大量データには集計パイプラインも有効
distinct()は手軽ですが、非常に大規模なコレクションではメモリ使用量に注意が必要です。そのような場合は、集計パイプラインの$groupと$countを組み合わせることで、サーバー側で効率的に件数を算出できます。
> db.countDistinctDemo.aggregate([
{ "$group": { "_id": "$StudentName" } },
{ "$count": "distinctCount" }
]);
用途やデータサイズに応じて、両者の方法を使い分けるとよいでしょう。
-
MongoDBでカーソルの反復回数をカウントする方法を解説
MongoDBでカーソルの反復をカウントするには?MongoDBにおいて、whileループとfind()メソッドが返すカーソルを組み合わせた独自のロジックを実装することで、カーソルの反復回数(特定の条件に一致するドキュメント数)をカウントできます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。1. ドキュメントを含むコレクションを作成するまず、サンプル用のドキュメントを挿入してコレクションを作成します。> db.demo724.insertOne( ... { ... details: ... { ...
-
MySQLで特定の値の出現回数をカウントする方法(COUNT関数の使い方)
MySQLでは、COUNT()関数とIF()関数を組み合わせることで、特定の値がテーブル内に何回出現するかを簡単に集計できます。この記事では、実際にデモテーブルを作成しながら、その手順をわかりやすく解説します。 1. デモ用テーブルの作成 まず、サンプルとして使用するテーブルを作成しましょう。ここでは、出荷日時と2つの数値カラムを持つ「countValueDemo」テーブルを定義します。 mysql> create table countValueDemo -> ( -> ShippingDatetime datetime, -> FirstValu