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

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 が最もシンプルで効果的です。

  1. MongoDBで値を重複なく選択(distinct)してカウントするクエリの書き方

    MongoDBでは、アグリゲーションフレームワーク(集計パイプライン)を活用することで、配列内の値を重複なく抽出し、それぞれの出現回数をカウントできます。本記事では、insertOne()でサンプルデータを作成し、$unwindや$groupなどのステージを組み合わせてdistinct(一意)な値を選択・集計する具体的な手順を解説します。1. サンプルコレクションの作成まずは、ドキュメントを挿入してコレクションを作成します。各ドキュメントには「Name」と「Marks」を持つdetails配列が含まれています。> db.demo586.insertOne( ... {detail

  2. MySQLで重複のない値とその件数を取得する方法

    MySQLでテーブル内の重複を除いた一意の値と、それぞれの値が出現する件数を一緒に取得したい場合は、GROUP BY句とCOUNT()関数を組み合わせるのが基本です。この記事では、具体的な手順をサンプルコード付きで解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable754 (ProductPrice int);Query OK, 0 rows affected (0.48 sec)2. テストデータを挿入するINSERTコマンドを使って、意図的に重複を含むデータを登録します。mysql> in