字段路径
MongoDB5.0 已于 10 月2024 结束生命周期。不再支持此版本的文档。要升级5.0 部署,请参阅 MongoDB6 。0 升级程序。
您可以使用 字段路径(Field Path)表达式访问权限输入文档中的字段。要指定字段路径(Field Path),请在字段名称或虚线字段路径(Field Path)(如果该字段位于嵌入式文档中)前加上美元符号$
。
用例
您可以在以下使用案例中使用字段路径:
嵌套字段
以下示例使用Atlas样本数据库中的planets集合。此集合中的每个文档都具有以下结构:
{ _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 }
嵌套字段数组
您可以在字段路径(Field Path)中使用点表示法来访问权限嵌套在大量中的字段。
示例,考虑一个包含 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" ] } ]
嵌套数组的数组
还可以在字段路径(Field Path)中使用带有美元符号$
的点表示法来访问权限嵌套大量中的大量。
此示例使用包含以下文档的 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" ] ] }