MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得する方法
MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得したい場合、aggregate()メソッドと$unwind演算子を組み合わせて使用するのが効果的です。この記事では、実際のコード例を通じてその手順を詳しく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo671.insertOne(
... {
... "details" : [
... {
... "id" : "1"
... },
... {
... CountryName:"US",
... "details1" : [
... {
... "id" : "1"
... },
... {
... "id" : "2"
... }
... ]
... },
... {
... CountryName:"UK",
... "details1" : [
... {
... "id" : "2"
... },
... {
... "id" : "1"
... }
... ]
... },
... {
... CountryName:"AUS",
... "details1" : [
... {
... "id" : "1"
... }
... ]
... }
... ]
... }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea3e5d004263e90dac943e0")
}2. コレクション内の全ドキュメントを表示
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo671.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ea3e5d004263e90dac943e0"), "details" : [ { "id" : "1" }, { "CountryName" : "US", "details1" : [ { "id" : "1" }, { "id" : "2" } ] }, { "CountryName" : "UK", "details1" : [ { "id" : "2" }, { "id" : "1" } ] }, { "CountryName" : "AUS", "details1" : [ { "id" : "1" } ] } ] }3. 条件に一致するサブドキュメントからフィールドを取得するクエリ
ここが本題です。$unwindで配列を展開し、$matchで条件に一致するドキュメントだけを絞り込み、$projectで必要なフィールドのみを出力します。
> db.demo671.aggregate([
...
... {$unwind: '$details'},
...
... {$match: {'details.details1.id': '1'}},
...
... {$project: {_id: 0, Country: '$details.CountryName'}}
... ]).pretty()このパイプラインでは、以下の処理が行われています。
- $unwind:
details配列を展開し、各要素を個別のドキュメントとして扱えるようにします。 - $match: ネストされた配列
details1の中にid: "1"を持つドキュメントだけを抽出します。 - $project:
_idを除外し、CountryNameをCountryという名前で出力します。
4. 実行結果
上記のクエリを実行すると、条件(id: "1")に一致するすべての国名が取得できます。
{ "Country" : "US" }
{ "Country" : "UK" }
{ "Country" : "AUS" }このように、$unwind → $match → $projectという集計パイプラインの流れを使えば、ネストされた配列構造の中から条件に合致する複数のサブドキュメントのフィールドを簡単に取り出すことができます。データの絞り込みやレポート生成など、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。
-
MongoDBで複数のドキュメントフィールドを完全一致検索するクエリの書き方
MongoDBで複数のフィールドを完全一致させる方法 MongoDBで複数のドキュメントフィールドに対して完全一致の条件を指定してレコードを取得したい場合は、$and演算子と$in演算子を組み合わせます。$in演算子の中に、マッチさせたい値の配列を設定することで、柔軟な完全一致検索が可能になります。 ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を見ていきましょう。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。 > db.demo422.insertOne({Name:Chris,Marks
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>