MongoDBで複数のフィールドを使ってグループ化し、重複したフィールド値の件数を取得する方法
MongoDBのaggregateと$condを使ったグループ化
この目的を達成するには、MongoDBのaggregateパイプラインを使用し、その中で$cond演算子を活用します。$condはブール式を評価し、結果に応じて指定された2つの戻り値のうちのいずれかを返す演算子です。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。
> db.demo536.insertOne({"Name1":"Chris","Name2":"David"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c843eef4dcbee04fbbc01")
}
> db.demo536.insertOne({"Name1":"David","Name2":"Chris"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c843fef4dcbee04fbbc02")
}
> db.demo536.insertOne({"Name1":"Bob","Name2":"Sam"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c843fef4dcbee04fbbc03")
}
> db.demo536.insertOne({"Name1":"Chris","Name2":"David"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c843fef4dcbee04fbbc04")
}登録済みドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo536.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e8c843eef4dcbee04fbbc01"), "Name1" : "Chris", "Name2" : "David" }
{ "_id" : ObjectId("5e8c843fef4dcbee04fbbc02"), "Name1" : "David", "Name2" : "Chris" }
{ "_id" : ObjectId("5e8c843fef4dcbee04fbbc03"), "Name1" : "Bob", "Name2" : "Sam" }
{ "_id" : ObjectId("5e8c843fef4dcbee04fbbc04"), "Name1" : "Chris", "Name2" : "David" }複数フィールドでグループ化するクエリ
以下は、複数のフィールドを使ってグループ化し、各グループの件数を取得するためのクエリです。
> db.demo536.aggregate([
... {
... $project:
... {
... FirstName1:
... {
... $cond: { if: { $gte: [ "$Name1", "$Name2" ] }, then: "$Name2", else: "$Name1" }
... },
... FirstName2:
... {
... $cond: { if: { $lt: [ "$Name1", "$Name2" ] }, then: "$Name2", else: "$Name1" }
... }
... }
... }
... ,{
... $group:
... {
... _id:
... {
... Name1: "$FirstName1",
... Name2: "$FirstName2"
... }
... ,count: { $sum: 1}
... }
... }
... ])
このクエリを実行すると、次のような出力が得られます。
{ "_id" : { "Name1" : "Bob", "Name2" : "Sam" }, "count" : 1 }
{ "_id" : { "Name1" : "Chris", "Name2" : "David" }, "count" : 3 }クエリの仕組み
このテクニックのポイントは$projectステージにあります。$condを使って「Name1」と「Name2」を比較し、辞書順で小さい方をFirstName1、大きい方をFirstName2として常に一定の順序で出力します。これにより、「Chris / David」と「David / Chris」のように記述順序が異なるだけのペアも、同一の組み合わせとして正規化されます。
その後、$groupステージで_idに両方の名前を含めてグループ化し、$sum: 1によって各グループのドキュメント件数をカウントしています。実行結果を見ると、「Chris / David」の組み合わせが3件(元の順序違いを含む)、「Bob / Sam」が1件として正しく集計されていることがわかります。
-
MySQLで列の重複値の出現回数を集計・並べ替える方法
MySQLでは、GROUP BYとORDER BY DESCを組み合わせることで、列に含まれる重複値(繰り返し値)ごとの出現回数を簡単に集計できます。この記事では、実際にテーブルを作成しながら、その手順をわかりやすく解説します。 1. サンプルテーブルの作成 まずは、投稿メッセージを格納するサンプルテーブルを作成しましょう。以下のようにCREATE TABLE文を実行します。 mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, ->
-
MySQLで結果を日付ごとにグループ化し、重複値の件数を表示するクエリの書き方
はじめにMySQLでは、GROUP BY句とDATE()関数、COUNT()関数を組み合わせることで、日付単位でレコードをグループ化し、重複する値の件数を簡単に集計できます。ここでは、到着日時ごとに乗客コードを集計する例を通して、その具体的な方法を解説します。1. サンプルテーブルの作成まず、以下のSQLを実行してテーブルを作成します。mysql> create table DemoTable1496-> (-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> PassengerCode varchar(20),-> A