MongoDBで配列から一意の要素を組み合わせる方法|aggregate()の使い方を解説
MongoDBで配列から一意の要素を組み合わせる方法
配列から一意の(重複しない)要素を組み合わせたい場合、MongoDBではaggregate()メソッドを使用します。本記事では、サンプルコレクションを作成し、複数の配列フィールドに格納された値からユニークな要素だけを抽出して結合する手順を、具体的なコード例とともにわかりやすく解説します。
1. サンプルコレクションの作成
まず、insert()メソッドを使ってドキュメントを挿入し、コレクションを作成しましょう。
> db.demo420.insert(
... {
... "details" : [
... {
... "Value1":10,
... "Value2":20,
... "Value3":30
... }
... ]
... }
... )
WriteResult({ "nInserted" : 1 })
> db.demo420.insert(
... {
... "Info" : [
... {
... "Value1":10,
... "Value2":20,
... "Value3":300
... }
... ]
... }
... )
WriteResult({ "nInserted" : 1 })
ここでは、「details」と「Info」という2つの異なるフィールド名を持つドキュメントを作成しました。どちらもValue1、Value2、Value3というキーを持つオブジェクトが配列内に格納されています。
2. コレクション内の全ドキュメントを確認する
find()メソッドを使えば、作成したコレクション内のすべてのドキュメントを表示できます。
> db.demo420.find();
このコマンドを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e739a569822da45b30346dc"), "details" : [ { "Value1" : 10, "Value2" : 20, "Value3" : 30 } ] }
{ "_id" : ObjectId("5e739a569822da45b30346dd"), "Info" : [ { "Value1" : 10, "Value2" : 20, "Value3" : 300 } ] }
3. 配列から一意の要素を組み合わせるクエリ
続いて、「Info」フィールドの各配列から一意の要素を取り出して結合するための集計クエリを見ていきましょう。
> db.demo420.aggregate([
... { "$project": {
... "_id": 0,
... "unique": {
... "$filter": {
... "input": {
... "$setDifference": [
... { "$concatArrays": [
... "$Info.Value1",
... "$Info.Value2",
... "$Info.Value3"
...
... ]},
... []
... ]
... },
... "cond": { "$ne": [ "$$this", "" ] }
... }
... }
... }},
... { "$unwind": "$unique" },
... { "$group": {
... "_id": null,
... "uniqueArray": { "$addToSet": "$unique" }
... }}
... ])
このクエリを実行すると、次のような結果が出力されます。
{ "_id" : null, "uniqueArray" : [ 300, 20, 10 ] }
4. クエリの仕組みを解説
この集計パイプラインは、主に以下の3つのステージで構成されています。
- $project:$concatArrays演算子で「Info」フィールド内のValue1、Value2、Value3の各配列を連結し、$setDifference演算子で空の配列[]との差分を取ることで重複を除去します。さらに$filterにより空文字列を除外しています。
- $unwind:「unique」配列を個々のドキュメントへと展開します。
- $group:$addToSet演算子を使うことで、重複のない値だけを「uniqueArray」という新しい配列にまとめ上げます。
このように、MongoDBのアグリゲーションフレームワークを活用すれば、複数の配列フィールドに分散した値から効率的にユニークな要素のセットを取得できます。データの重複排除や集計処理など、さまざまな場面で応用できるテクニックなので、ぜひマスターしておきましょう。
-
MongoDBのaggregate()と$setUnionを使って、1つのドキュメント内の2つの配列から一意の値を取得する方法
MongoDBでは、1つのドキュメントに含まれる複数の配列フィールドから重複を除いた値(一意の値)を取得したいケースがあります。そんなときに便利なのが、集計フレームワーク(aggregate())で使える $setUnion 演算子です。$setUnion は2つ以上の配列を受け取り、いずれかの入力配列に出現する要素をすべて含む配列を返します。このとき重複した要素は自動的に取り除かれるため、手動でのフィルタリングが不要になります。サンプルコレクションの作成まずは、2つの名前リストを持つドキュメントを含むコレクションを作成しましょう。以下のコマンドで demo608 コレクションにドキュメントを
-
C++で2つの配列から作れるペアの最大数を求めるアルゴリズム
問題の概要同じサイズ N を持つ2つの配列が与えられたとき、各配列から1つずつ要素を選んでペアを作り、そのペアの最大数を求めます。ただし、以下の条件を満たす必要があります。各配列の要素は最大1回しか使用できないペアを構成する2つの要素の絶対差が指定された値 K 以下であること入力例たとえば、次のような入力が与えられたとします。arr1[] = {3, 4, 5, 2, 1} arr2[] = {6, 5, 4, 7, 15} k = 3この場合、絶対差が3以下になるペアは次の4組です。(1, 4), (2, 5), (3, 6), (4, 7)したがって、答えは 4 となります。アルゴリズムの