MongoDB聚合运算符:$getField

文章目录

$getField聚合运算符返回文档中指定字段的值,字段名可以包含点.或以$开头。如果不指定,$getField将$$CURRENT作为字段返回。

语法

js 复制代码
{
  $getField: {
    field: <String>,
    input: <Object>
  }
}

字段说明:

  • field,字符串类型,指定数据对象中要返回的字段,可以是字符串表达式,如果字段以$符号开头,则需要把字段名放在$literal表达式返回。
  • input,对象类型,缺省值为$$CURRENT,可以是一个包含了指定字段值的表达式,input必须要能解析为一个对象、缺失、空或未定义,如果省略,默认为当前管道中处理的文档$$CURRENT。

从$$CURRENT返回字段值的简单写法如下:

js 复制代码
{
  $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集合的内容如下:

json 复制代码
{ "_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的产品:

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

操作返回下面的结果:

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

查询以($)开头的字段

集合inventory有下面的文档:

json 复制代码
{ "_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的产品:

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

操作返回下面的结果:

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

子文档字段查询

使用下面的脚本创建inventory集合:

js 复制代码
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的文档:

js 复制代码
db.inventory.aggregate( [
   { $match:
      { $expr:
         { $lte:
            [
               { $getField:
                  { field: { $literal: "$small" },
                    input: "$quantity"
                  }
               },
               20
            ]
         }
      }
   }
] )
  • $lte 运算符用于查找小于等于20的文档
  • $getField需要明确的field和input参数,因为$small字段是子文档的一部分
  • 因为字段名前面有$符号,$getField使用$literal来计算"$small"

输出结果如下:

js 复制代码
[
  {
    _id: 3,
    item: 'sun dress',
    'price.usd': 199.99,
    quantity: { '$large': 45, '$medium': 40, '$small': 5 }
  }
]
相关推荐
SelectDB技术团队4 小时前
Snowflake 的开源替代怎么选:能力对照、三条部署路径与迁移执行
大数据·数据库·云原生·开源·snowflake·apache doris
Elastic 中国社区官方博客4 小时前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
京东云开发者4 小时前
当我谈数据库高可用时我谈些什么
数据库
梦影_5 小时前
MySQL进阶教程(一)—— 储存过程与触发器(上)
开发语言·数据库·后端·sql·mysql·中间件
星禾元亨5 小时前
用结构化数据与干净实体信号,让技术内容被 AI 搜索引擎稳定引用
数据库·人工智能·自动化·创业创新
底层玩家老张5 小时前
45:1压缩、19.1倍查询:1956亿行时序数据复盘
数据库·经验分享·时序数据库·存储压缩·写入优化
qq_白羊座5 小时前
口头说的 JSON 和 MySQL 里的 JSON
数据库·mysql·json
Shaoshing5 小时前
多表查询
数据库
不爱学英文的码字机器5 小时前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft
Lynne3096 小时前
TSN 技术解析:如何应对工业网络中的延迟、抖动与丢包?
数据库·确定性通信·tsn时间敏感网络