フィールドパス
入力ドキュメント内のフィールドにアクセスするには、 フィールドパス式を使用します。フィールドパスを指定するには、フィールド名または ドット付きフィールドパス(埋め込みドキュメント内のフィールドの場合)の前にドル記号$
を付けます。
ユースケース
たとえば、次のユースケースではフィールドパスを使用できます。
ネストされたフィールド
次の例では、 Atlas サンプルデータベース の プロファイリングコレクションを使用します。このコレクション内の各ドキュメントの構造は次のとおりです。
{ _id: new ObjectId("6220f6b78a733c51b416c80e"), name: "Uranus", orderFromSun: 7, hasRings: true, mainAtmosphere: [ "H2", "He", "CH4" ], surfaceTemperatureC: { min: null, max: null, mean: -197.2 } }
フィールド内にネストされたフィールドmean
surfaceTemperatureC
"field.nestedField"
を指定するには、ドル記号 を使用したドット表記( )$
を使用します。次の集計パイプラインでは、各ドキュメントのmean
ネストされたフィールド値のみがプロジェクションされます。
db.planets.aggregate( [ { $project: { nested_field: "$surfaceTemperatureC.mean" } } ] )
以下は、返されたドキュメントの例です。
{ _id: ObjectId('6220f6b78a733c51b416c80e'), nested_field: -197.2 }
ネストされたフィールドの配列
フィールドパス内のドット表記を使用して、配列内にネストされたフィールドにアクセスできます。
例、instock
フィールドを含む products
コレクションを考えてみましょう。 instock
フィールドには、ネストされた warehouse
フィールドの配列が含まれています。
db.products.insertMany( [ { item: "journal", instock: [ { warehouse: "A"}, { warehouse: "C" } ] }, { item: "notebook", instock: [ { warehouse: "C" } ] }, { item: "paper", instock: [ { warehouse: "A" }, { warehouse: "B" } ] }, { item: "planner", instock: [ { warehouse: "A" }, { warehouse: "B" } ] }, { item: "postcard", instock: [ { warehouse: "B" }, { warehouse: "C" } ] } ] )
次の集計パイプラインは $instock.warehouse
を使用してネストされた warehouse
フィールドにアクセスします。
db.products.aggregate( [ { $project: { item: 1, warehouses: "$instock.warehouse" } } ] )
この例では 、$instock.warehouse
は、各ドキュメントのネストされた warehouse
フィールドにある値の配列を出力します。パイプラインは次のドキュメントを返します。
[ { _id: ObjectId('6740b55e33b29cf6b1d884f7'), item: "journal", warehouses: [ "A", "C" ] }, { _id: ObjectId('6740b55e33b29cf6b1d884f8'), item: "notebook", warehouses: [ "C" ] }, { _id: ObjectId('6740b55e33b29cf6b1d884f9'), item: "paper", warehouses: [ "A", "B" ] }, { _id: ObjectId('6740b55e33b29cf6b1d884fa'), item: "planner", warehouses: [ "A", "B" ] }, { _id: ObjectId('6740b55e33b29cf6b1d884fb'), item: "postcard", warehouses: [ "B", "C" ] } ]
ネストされた配列の配列
フィールドパスにドル記号$
を含むドット表記を使用して、ネストされた配列内の配列にアクセスすることもできます。
この例では、次のドキュメントを含む fruits
コレクションを使用します。
db.fruits.insertOne( { _id: ObjectId("5ba53172ce6fa2fcfc58e0ac"), inventory: [ { apples: [ "macintosh", "golden delicious", ] }, { oranges: [ "mandarin", ] }, { apples: [ "braeburn", "honeycrisp", ] } ] } )
コレクション内のドキュメントには inventory
配列が含まれています。配列の各要素は、ネストされた配列フィールドを含むオブジェクトです。
次の集計パイプラインについて考えてみましょう。
db.fruits.aggregate( [ { $project: { all_apples: "$inventory.apples" } } ] )
このパイプラインでは、$inventory.apples
はネストされた配列の配列に解決されます。パイプラインは、次のドキュメントを返します。
{ _id: ObjectId('5ba53172ce6fa2fcfc58e0ac'), all_apples: [ [ "macintosh", "golden delicious" ], [ "braeburn", "honeycrisp" ] ] }
詳細
ネストされた要素へのアクセスと操作の詳細については、 ドット表記 および 埋め込みドキュメントの配列のクエリ を参照してください。