MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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件として正しく集計されていることがわかります。

  1. MySQLで列の重複値の出現回数を集計・並べ替える方法

    MySQLでは、GROUP BYとORDER BY DESCを組み合わせることで、列に含まれる重複値(繰り返し値)ごとの出現回数を簡単に集計できます。この記事では、実際にテーブルを作成しながら、その手順をわかりやすく解説します。 1. サンプルテーブルの作成 まずは、投稿メッセージを格納するサンプルテーブルを作成しましょう。以下のようにCREATE TABLE文を実行します。 mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, ->

  2. MySQLで結果を日付ごとにグループ化し、重複値の件数を表示するクエリの書き方

    はじめにMySQLでは、GROUP BY句とDATE()関数、COUNT()関数を組み合わせることで、日付単位でレコードをグループ化し、重複する値の件数を簡単に集計できます。ここでは、到着日時ごとに乗客コードを集計する例を通して、その具体的な方法を解説します。1. サンプルテーブルの作成まず、以下のSQLを実行してテーブルを作成します。mysql> create table DemoTable1496-> (-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> PassengerCode varchar(20),-> A