MongoDBのaggregate()で特定のネストされたプロパティを投影(プロジェクション)する方法
MongoDBで特定のネストされたプロパティに対してプロジェクション(投影)を行いたい場合は、aggregate()メソッドを使用します。この記事では、実際のコード例を通して手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは、3階層にネストされた構造を持つドキュメントを挿入します。
> db.demo379.insertOne(
... {
... "details1" : {
... "details2" : {
... "details3" : {
... "10" : "John",
... "50" : "Chris",
... "40" : "David",
... "30":"Mike"
... }
... }
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5a94f82ae06a1609a00b10")
}2. 登録したドキュメントの確認
続いて、find()メソッドを使ってコレクション内のすべてのドキュメントを表示します。
> db.demo379.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e5a94f82ae06a1609a00b10"),
"details1" : {
"details2" : {
"details3" : {
"10" : "John",
"30" : "Mike",
"40" : "David",
"50" : "Chris"
}
}
}
}3. 特定のネストされたプロパティを投影するクエリ
以下は、ネストされたプロパティの中から条件に合うものだけを抽出して投影するクエリです。この例では、キーが「35」以上「60」以下の要素のみを取り出しています。
> db.demo379.aggregate([
... { "$addFields": {
... "details1.details2.details3": {
... "$arrayToObject": {
... "$filter": {
... "input": { "$objectToArray": "$details1.details2.details3" },
... "as": "out",
... "cond": {
... "$and": [
... { "$gte": ["$$out.k", "35"] },
... { "$lte": ["$$out.k", "60"] },
... ]
... }
... }
... }
... }
... } }
... ])実行結果は次のとおりです。「40」と「50」のキーを持つ要素だけが出力されていることがわかります。
{ "_id" : ObjectId("5e5a94f82ae06a1609a00b10"), "details1" : { "details2" : { "details3" : { "40" : "David", "50" : "Chris" } } } }クエリの仕組み
このクエリでは、複数の集計オペレーターを組み合わせてネストされたオブジェクトを操作しています。
- $objectToArray: オブジェクトを「k(キー)」と「v(値)」のペアからなる配列に変換します。
- $filter: 変換した配列から条件に一致する要素だけを抽出します。ここではキー($$out.k)が文字列として「35」以上「60」以下である要素を対象にしています。
- $arrayToObject: フィルタリング後の配列を再びオブジェクト形式に戻します。
- $addFields: 処理結果で元のフィールド
details1.details2.details3を上書きします。
なお、キーは文字列として比較されるため、辞書順での判定になる点に注意してください。この手法を使えば、通常のfind()のプロジェクションでは難しい「動的なキー名を持つネストされたオブジェクトの絞り込み」も柔軟に実現できます。
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO
-
MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説
MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db