Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

$getField(聚合)

在此页面上

  • 定义
  • 语法
  • 行为
  • 示例
$getField

版本 5.0 中的新增功能

从文档中返回指定字段的值。如果未指定对象,$getField 会返回 $$CURRENT 中的字段值。

您可以使用 $getField 检索名称中包含句点 (.) 或以美元符号 ($) 开头的字段的值。

提示

使用 $setField 添加名称中包含美元符号 ($) 或句点 (.) 的字段。

$getField 通过以下语法实现:

{
$getField: {
field: <String>,
input: <Object>
}
}
字段
类型
说明
field
字符串

要返回值的输入对象。

在版本7.2 中进行了更改:field 接受解析为字符串的任何有效表达式。

如果field以美元符号 ( $ ) 开头,则将字段名称放在$literal$toString表达式中以返回其值。

input
对象

默认值$$CURRENT

一个有效的表达式,包含要返回值的 fieldinput 必须解析为对象、missingnullundefined。如果省略,则默认为管道中当前正在处理的文档 ($$CURRENT)。

$getField 具有以下用于从 $$CURRENT 检索字段值的速记语法:

{
$getField: <String>
}

对于此语法,参数等效于上述 field 的值。

  • 如果您指定的 field 不存在于 input 对象中,或者如果您未指定 input 对象,则不存在于 $$CURRENT 中,$getField 将返回 missing

  • 如果 input 的计算结果为 missingundefinednull$getField 将返回 null

  • 如果 input 的计算结果为对象、missingundefinednull 以外的任何值,$getField 将返回错误。

  • $getField 不会隐式遍历对象或数组。例如,$getFielda.b.cfield 值计算为顶级字段 a.b.c,而不是嵌套字段 { a: { b: { c: } } }

提示

另请参阅:

考虑包含以下文档的 inventory 集合:

{ "_id" : 1, "item" : "sweatshirt", "price.usd": 45.99, qty: 300 }
{ "_id" : 2, "item" : "winter coat", "price.usd": 499.99, qty: 200 }
{ "_id" : 3, "item" : "sun dress", "price.usd": 199.99, qty: 250 }
{ "_id" : 4, "item" : "leather boots", "price.usd": 249.99, qty: 300 }
{ "_id" : 5, "item" : "bow tie", "price.usd": 9.99, qty: 180 }

以下操作使用 $getField$gt 操作符来查找哪些产品的 price.usd 大于 200

db.inventory.aggregate( [
{
$match:
{ $expr:
{ $gt: [ { $getField: "price.usd" }, 200 ] }
}
}
] )

操作返回以下结果:

[
{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },
{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 }
]

考虑包含以下文档的 inventory 集合:

{ "_id" : 1, "item" : "sweatshirt", "$price": 45.99, qty: 300 }
{ "_id" : 2, "item" : "winter coat", "$price": 499.99, qty: 200 }
{ "_id" : 3, "item" : "sun dress", "$price": 199.99, qty: 250 }
{ "_id" : 4, "item" : "leather boots", "$price": 249.99, qty: 300 }
{ "_id" : 5, "item" : "bow tie", "$price": 9.99, qty: 180 }

以下操作使用 $getField$gt$literal 操作符来查找哪些产品的 $price 大于 200

db.inventory.aggregate( [
{
$match:
{ $expr:
{ $gt: [ { $getField: {$literal: "$price" } }, 200 ] }
}
}
] )

操作返回以下结果:

[
{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },
{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 }
]

使用以下文档创建 inventory 集合:

db.inventory.insertMany( [
{ "_id" : 1, "item" : "sweatshirt", "price.usd": 45.99,
"quantity": { "$large": 50, "$medium": 50, "$small": 25 }
},
{ "_id" : 2, "item" : "winter coat", "price.usd": 499.99,
"quantity": { "$large": 35, "$medium": 35, "$small": 35 }
},
{ "_id" : 3, "item" : "sun dress", "price.usd": 199.99,
"quantity": { "$large": 45, "$medium": 40, "$small": 5 }
},
{ "_id" : 4, "item" : "leather boots", "price.usd": 249.99,
"quantity": { "$large": 20, "$medium": 30, "$small": 40 }
},
{ "_id" : 5, "item" : "bow tie", "price.usd": 9.99,
"quantity": { "$large": 0, "$medium": 10, "$small": 75 }
}
] )

以下操作将返回 $small 项的数量小于或等于 20 的文档。

db.inventory.aggregate( [
{ $match:
{ $expr:
{ $lte:
[
{ $getField:
{ field: { $literal: "$small" },
input: "$quantity"
}
},
20
]
}
}
}
] )

使用这些操作符来查询集合:

  • $lte 操作符查找小于等于 20 的值。

  • $getField 需要显式 fieldinput 参数,因为 $small 字段包含在子文档中。

  • $getField 使用 $literal 来评估 "$small",因为字段名称中有一个美元符号 ($)。

示例输出:

[
{
_id: 3,
item: 'sun dress',
'price.usd': 199.99,
quantity: { '$large': 45, '$medium': 40, '$small': 5 }
}
]

后退

$function