MongoDBで複数のフィールドに対してdistinct(重複排除)を実行する方法
MongoDBで複数のフィールドに対してdistinct(重複値の抽出)を実行したい場合は、集計フレームワーク(Aggregation Framework)の $group 演算子と $addToSet を組み合わせることで実現できます。
この記事では、実際にコレクションを作成しながら、複数フィールドのdistinct処理の手順を具体的に解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。
> db.distinctOnMultipleFieldsDemo.insertOne(
... {
... "StudentFirstName" : "Chris",
... "StudentAge" : 21,
... "StudentCountryName": "US"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2e518b64f4b851c3a13d7")
}
> db.distinctOnMultipleFieldsDemo.insertOne(
... {
... "StudentFirstName" : "Robert",
... "StudentAge" : 21,
... "StudentCountryName": "AUS"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2e518b64f4b851c3a13d8")
}
> db.distinctOnMultipleFieldsDemo.insertOne(
... {
... "StudentFirstName" : "Chris",
... "StudentAge" : 22,
... "StudentCountryName": "UK"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2e518b64f4b851c3a13d9")
}
> db.distinctOnMultipleFieldsDemo.insertOne(
... {
... "StudentFirstName" : "David",
... "StudentAge" : 24,
... "StudentCountryName": "AUS"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2e518b64f4b851c3a13da")
}
2. 登録したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.distinctOnMultipleFieldsDemo.find().pretty();
上記のクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cd2e518b64f4b851c3a13d7"),
"StudentFirstName" : "Chris",
"StudentAge" : 21,
"StudentCountryName" : "US"
}
{
"_id" : ObjectId("5cd2e518b64f4b851c3a13d8"),
"StudentFirstName" : "Robert",
"StudentAge" : 21,
"StudentCountryName" : "AUS"
}
{
"_id" : ObjectId("5cd2e518b64f4b851c3a13d9"),
"StudentFirstName" : "Chris",
"StudentAge" : 22,
"StudentCountryName" : "UK"
}
{
"_id" : ObjectId("5cd2e518b64f4b851c3a13da"),
"StudentFirstName" : "David",
"StudentAge" : 24,
"StudentCountryName" : "AUS"
}
3. 複数フィールドに対するdistinctの実行
それでは、aggregate() メソッドと $group 演算子を使って、複数のフィールドに対してdistinctを実行します。各フィールドの値を $addToSet で収集することで、重複のない値のセットを取得できます。
> db.distinctOnMultipleFieldsDemo.aggregate([
... {
... $group:
... {
... _id:0,
... StudentFirstName: {$addToSet: '$StudentFirstName'},
... StudentAge: {$addToSet: '$StudentAge'},
... StudentCountryName: {$addToSet: '$StudentCountryName'},
... }}
... ]);
このクエリを実行すると、以下のような結果が出力されます。
{ "_id" : 0, "StudentFirstName" : [ "David", "Robert", "Chris" ], "StudentAge" : [ 24, 22, 21 ], "StudentCountryName" : [ "UK", "AUS", "US" ] }
ポイント解説
$groupの_id: 0を指定することで、すべてのドキュメントを1つのグループにまとめています。$addToSetは、指定したフィールドの値を配列に追加する際に重複を自動的に排除する演算子です。- 結果として、学生名・年齢・国名それぞれのフィールドについて、重複のない値が配列形式で取得できています。
このように、MongoDBでは単一フィールドの distinct() メソッドとは異なり、複数フィールドの重複排除を行う場合は集計フレームワークを活用するのが一般的なアプローチです。
-
MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得する方法
MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得したい場合、aggregate()メソッドと$unwind演算子を組み合わせて使用するのが効果的です。この記事では、実際のコード例を通じてその手順を詳しく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo671.insertOne( ... { ... details : [ ... { ... id : 1 ... }, ... { ... CountryName:US, ...
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>