MongoDBのaggregate()と$setUnionを使って、1つのドキュメント内の2つの配列から一意の値を取得する方法
MongoDBでは、1つのドキュメントに含まれる複数の配列フィールドから重複を除いた値(一意の値)を取得したいケースがあります。そんなときに便利なのが、集計フレームワーク(aggregate())で使える $setUnion 演算子です。
$setUnion は2つ以上の配列を受け取り、いずれかの入力配列に出現する要素をすべて含む配列を返します。このとき重複した要素は自動的に取り除かれるため、手動でのフィルタリングが不要になります。
サンプルコレクションの作成
まずは、2つの名前リストを持つドキュメントを含むコレクションを作成しましょう。以下のコマンドで demo608 コレクションにドキュメントを挿入します。
> db.demo608.insertOne({"ListOfName1":["John","Chris","Bob","David"],"ListOfName2":["Bob", "Sam","John","Robert","Chris"]}
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e974542f57d0dc0b182d62b")
}挿入したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.demo608.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e974542f57d0dc0b182d62b"),
"ListOfName1" : [
"John",
"Chris",
"Bob",
"David"
],
"ListOfName2" : [
"Bob",
"Sam",
"John",
"Robert",
"Chris"
]
}ご覧のとおり、「Bob」「John」「Chris」は両方の配列に重複して存在しています。
$setUnionで一意の値を取得するクエリ
それでは、1つのドキュメント内にある2つの配列から一意の値を取得するクエリを見てみましょう。aggregate() の中で $project ステージを使用し、$setUnion によって2つの配列を結合します。
> db.demo608.aggregate([
... {$project:{SetOfNames:{$setUnion:['$ListOfName1','$ListOfName2']}}}
... ]).pretty();実行結果
上記のクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e974542f57d0dc0b182d62b"),
"SetOfNames" : [
"Bob",
"Chris",
"David",
"John",
"Robert",
"Sam"
]
}ポイントまとめ
$setUnionは2つ以上の配列を引数に取り、重複のない要素の集合を返します。- 出力結果の配列は自動的にソートされるため、整然としたデータが得られます。
$projectステージと組み合わせることで、元のフィールドを残しつつ新しいフィールドとして結果を出力できます。
このように $setUnion を活用すれば、1つのドキュメント内の複数配列にまたがる重複データを簡単に統合・整理できます。タグの統合やユーザーの属性リストのマージなど、さまざまな場面で応用できる便利な演算子です。
-
MongoDBコレクションから一意の値(重複なし)を取得する方法【distinct()の使い方】
MongoDBでコレクション内の重複データを除外し、一意の値だけを取得したい場合は、distinct()メソッドを使用します。distinct()は、指定したフィールドに含まれる重複しない値を1つのコレクション全体から検索し、その結果を配列として返します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを挿入し、コレクションを作成します。> db.demo704.insertOne({"LanguageCode":"hi"}); { "acknowledged" : true, &quo
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [