跳到主要内容

字段路径

2025年02月27日
柏拉文
越努力,越幸运

前言


字段路径文档

一、认识


$<field> 使用 $ 来指示字段路径。$<field> 等效于 $$CURRENT.<field>

$<field>.<sub-field>: 使用 $. 来只是内嵌文档字段路径

二、嵌套字段


集合中的每个文档都具有以下结构:

{
_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"
}
}
] )

三、嵌套字段数组


您可以在字段路径(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"
}
}
] )

四、嵌套数组的数组


还可以在字段路径(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" } }
] )