MongoDBで2つのフィールドを選択し、重複のない値を持つソート済み配列を返す方法
MongoDBで2つのフィールドを選択し、その値から重複(distinct)を除いた上で、ソート済みの配列として結果を取得したい場合があります。これを実現するには、アグリゲーションフレームワークと $setUnion 演算子を組み合わせて使用します。
$setUnion は、複数の配列を受け取り、それらを統合した上で自動的に重複を除去し、昇順にソートされた配列を返してくれる便利な演算子です。実際の手順をサンプルコードとともに見ていきましょう。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。
> db.sortedArrayWithDistinctDemo.insertOne(
... { value1: 4, value2: 5}
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e666")
}
> db.sortedArrayWithDistinctDemo.insertOne(
... {value1: 5, value2: 6}
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e667")
}
> db.sortedArrayWithDistinctDemo.insertOne(
... {value1: 7, value2: 4}
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e668")
}2. 登録したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.sortedArrayWithDistinctDemo.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5cc690b99cb58ca2b005e666"), "value1" : 4, "value2" : 5 }
{ "_id" : ObjectId("5cc690b99cb58ca2b005e667"), "value1" : 5, "value2" : 6 }
{ "_id" : ObjectId("5cc690b99cb58ca2b005e668"), "value1" : 7, "value2" : 4 }3. アグリゲーションで重複のないソート済み配列を取得する
続いて、2つのフィールド(ここでは「value1」と「value2」)を選択し、それらの値から重複を除去したソート済み配列を返すクエリです。処理の流れは以下の通りです。
- $group: 全ドキュメントをグループ化し、各フィールドの値を $push で配列にまとめます。
- $project: _id を除外し、$setUnion を使って2つの配列を統合します。
> db.sortedArrayWithDistinctDemo.aggregate(
... [
... { "$group": {
... "_id": null,
... "value1": { "$push": "$value1" },
... "value2": { "$push": "$value2" }
... }},
... { "$project": {
... "_id": 0,
... "bothValues": { "$setUnion": [ "$value1", "$value2" ] }
... }}
... ]
... );このクエリを実行すると、以下のような出力が得られます。2つのフィールドの値が統合され、重複が取り除かれたソート済み配列が返されていることが確認できます。
{ "bothValues" : [ 4, 5, 6, 7 ] }このように、$group でフィールドごとの値を集め、$setUnion で統合するだけで、追加のソート処理を書くことなく重複のない昇順配列を簡単に取得できます。類似の演算子として $addToSet や $unionWith などもありますが、既存の配列同士を統合して重複を排除したいケースでは $setUnion が最もシンプルで効果的です。
-
MongoDBで値を重複なく選択(distinct)してカウントするクエリの書き方
MongoDBでは、アグリゲーションフレームワーク(集計パイプライン)を活用することで、配列内の値を重複なく抽出し、それぞれの出現回数をカウントできます。本記事では、insertOne()でサンプルデータを作成し、$unwindや$groupなどのステージを組み合わせてdistinct(一意)な値を選択・集計する具体的な手順を解説します。1. サンプルコレクションの作成まずは、ドキュメントを挿入してコレクションを作成します。各ドキュメントには「Name」と「Marks」を持つdetails配列が含まれています。> db.demo586.insertOne( ... {detail
-
MySQLで重複のない値とその件数を取得する方法
MySQLでテーブル内の重複を除いた一意の値と、それぞれの値が出現する件数を一緒に取得したい場合は、GROUP BY句とCOUNT()関数を組み合わせるのが基本です。この記事では、具体的な手順をサンプルコード付きで解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable754 (ProductPrice int);Query OK, 0 rows affected (0.48 sec)2. テストデータを挿入するINSERTコマンドを使って、意図的に重複を含むデータを登録します。mysql> in