文章目录
- 语法
- 使用
- 举例
- 包含点号(.)的查询
- 查询以($)开头的字段
- 子文档字段查询
$getField聚合运算符返回文档中指定字段的值,字段名可以包含点.或以$开头。如果不指定,$getField将$$CURRENT作为字段返回。
语法
{$getField: {field: <String>,input: <Object>}
}
字段说明:
- field,字符串类型,指定数据对象中要返回的字段,可以是字符串表达式,如果字段以
$符号开头,则需要把字段名放在$literal表达式返回。 - input,对象类型,缺省值为
$$CURRENT,可以是一个包含了指定字段值的表达式,input必须要能解析为一个对象、缺失、空或未定义,如果省略,默认为当前管道中处理的文档$$CURRENT。
从$$CURRENT返回字段值的简单写法如下:
{$getField: <String>
}
使用
- 如果
field不是字符串类型,$getField返回错误 - 如果
input对象中不存在field或者未指定input时$$CURRENT不不存在field字段,$getField返回missing - 如果
input计算结果为missing、undefined或null,$getField返回null - 如果
input计算结果不是对象、missing、undefined或null,则$getField返回错误 $getField不会隐式遍历对象或数组,例如:$getField执行时会将field为a.b.c认为是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需要明确的field和input参数,因为$small字段是子文档的一部分- 因为字段名前面有
$符号,$getField使用$literal来计算"$small"
输出结果如下:
[{_id: 3,item: 'sun dress','price.usd': 199.99,quantity: { '$large': 45, '$medium': 40, '$small': 5 }}
]