MongoDB聚合:$densify

这篇具有很好参考价值的文章主要介绍了MongoDB聚合:$densify。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

$densify阶段可以为文档序列中字段缺失的某些值创建新文档。其主要的用途有:

  • 补齐时间序列数据。
  • 为分组数据添加缺失值。
  • 为指定的值范围填充数据。

语法

$densify阶段的语法:

{
   $densify: {
      field: <fieldName>,
      partitionByFields: [ <field 1>, <field 2> ... <field n> ],
      range: {
         step: <number>,
         unit: <time unit>,
         bounds: < "full" || "partition" > || [ < lower bound >, < upper bound > ]
      }
   }
}

$densify阶段的参数主要有以下字段:

field

必选字段,要填充的字段,字段的值必须是数值或日期类型,文档中其他没有被field指定的字段则会直接通过管道,不会被修改。如果指定的<field>在内嵌文档或数组中,需要使用点号。

partitionByFields

可选字段,一组字段构成的键值用于对文档进行分组。在$densify阶段,每组文档被称为一个分区。若省略这个字段,$densify则对整个集合使用一个分组。

range

必选字段,一个对象,指定数据如何被填充。

range.bounds

必选字段,可以用下面两种方式指定range.bounds

  • 数组形式:[ < lower bound >, < upper bound > ],
  • 字符串形式:"full""partition"

如果bounds是一个数组:

  • $densify添加涵盖指定范围值的文档。
  • bounds的数据类型必须与填充的字段类型保持一致。

如果bounds"full"

  • $densify添加涵盖指定范围值的文档。

如果bounds"partition"

  • $densify将文档添加到每个分区,类似于单独对每个分区单独运行full范围致密化。

range.step

必须字段,所有文档中field值的增量,$densify按照step(步长)在已经存在的文档之间创建新文档。如果指定了range.unit字段,step必须是一个整数,否则step可以是任意的数值。

range.unit

如果field为日期则是必须字段,unit用于日期类型的field增量的单位。可以指定为下面字符串的值之一:

  • millisecond
  • second
  • minute
  • hour
  • day
  • week
  • month
  • quarter
  • year

使用

field的限制

如果文档包含的field有下列情况将报错:

  • 集合中任何文档中指定的field值有日期类型,且没有指定unit字段的
  • 集合中任何文档中指定的field值有数值类型,且没有指定unit字段的
  • 如果要densify的字段field名称以$开头,必须要对其改名,可以使用$project

partitionByFields的限制

下面的情况出现在partitionByFields数组字段名中时将报错:

  • 求值结果为非字符串值
  • $开头

range.bounds的行为

如果range.bounds是一个数组:

  • 下限值表示新增文档的起始值,与集合中已有的文档无关。
  • 下限包含在内。
  • 上限不包含在内。
  • $densify不会过滤掉字段值超出指定范围的文档。

输出顺序

$densify不保证输出文档的顺序。想要保证有序,可以使用$sort对想要排序的字段进行排序。

举例

填充时间序列数据

创建一个包含四小时温度读数的weather集合。

db.weather.insertMany( [
   {
       "metadata": { "sensorId": 5578, "type": "temperature" },
       "timestamp": ISODate("2021-05-18T00:00:00.000Z"),
       "temp": 12
   },
   {
       "metadata": { "sensorId": 5578, "type": "temperature" },
       "timestamp": ISODate("2021-05-18T04:00:00.000Z"),
       "temp": 11
   },
   {
       "metadata": { "sensorId": 5578, "type": "temperature" },
       "timestamp": ISODate("2021-05-18T08:00:00.000Z"),
       "temp": 11
   },
   {
       "metadata": { "sensorId": 5578, "type": "temperature" },
       "timestamp": ISODate("2021-05-18T12:00:00.000Z"),
       "temp": 12
   }
] )

下面使用$densify阶段来填补四小时间隔之间的空白,实现小时粒度的数据点:

db.weather.aggregate( [
   {
      $densify: {
         field: "timestamp",
         range: {
            step: 1,
            unit: "hour",
            bounds:[ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ]
         }
      }
   }
] )

在这个例子中:

  • $densify阶段填充温度记录之前的空缺时间
    • field"timestamp"填充timestamp(时间戳)字段
    • range:
      • step:1表示timestamp字段的增量为1个单位
      • unit:hour表示timestamp字段填充为小时
      • bounds: [ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ]设置了要填充的时间范围

在下面的输出中,$densify阶段以小时为单位填充了00:00:0008:00:00之间的间隙:

[
  {
    _id: ObjectId("618c207c63056cfad0ca4309"),
    metadata: { sensorId: 5578, type: 'temperature' },
    timestamp: ISODate("2021-05-18T00:00:00.000Z"),
    temp: 12
  },
  { timestamp: ISODate("2021-05-18T01:00:00.000Z") },
  { timestamp: ISODate("2021-05-18T02:00:00.000Z") },
  { timestamp: ISODate("2021-05-18T03:00:00.000Z") },
  {
    _id: ObjectId("618c207c63056cfad0ca430a"),
    metadata: { sensorId: 5578, type: 'temperature' },
    timestamp: ISODate("2021-05-18T04:00:00.000Z"),
    temp: 11
  },
  { timestamp: ISODate("2021-05-18T05:00:00.000Z") },
  { timestamp: ISODate("2021-05-18T06:00:00.000Z") },
  { timestamp: ISODate("2021-05-18T07:00:00.000Z") },
  {
    _id: ObjectId("618c207c63056cfad0ca430b"),
    metadata: { sensorId: 5578, type: 'temperature' },
    timestamp: ISODate("2021-05-18T08:00:00.000Z"),
    temp: 11
  }
  {
    _id: ObjectId("618c207c63056cfad0ca430c"),
    metadata: { sensorId: 5578, type: 'temperature' },
    timestamp: ISODate("2021-05-18T12:00:00.000Z"),
    temp: 12
  }
]

分区填充

创建一个coffee数据集,其中包含两种咖啡豆的数据:

db.coffee.insertMany( [
   {
      "altitude": 600,
      "variety": "Arabica Typica",
      "score": 68.3
   },
   {
      "altitude": 750,
      "variety": "Arabica Typica",
      "score": 69.5
   },
   {
      "altitude": 950,
      "variety": "Arabica Typica",
      "score": 70.5
   },
   {
      "altitude": 1250,
      "variety": "Gesha",
      "score": 88.15
   },
   {
     "altitude": 1700,
     "variety": "Gesha",
     "score": 95.5,
     "price": 1029
   }
] )
填充范围内全部的值

下面的例子使用$densify为所有的咖啡variety填充altitude字段:

db.coffee.aggregate( [
   {
      $densify: {
         field: "altitude",
         partitionByFields: [ "variety" ],
         range: {
            bounds: "full",
            step: 200
         }
      }
   }
] )

在上例的聚合中:

  • 根据variety对文档进行分区,创建了两个分组分别是’Arabica Typica’和Gesha咖啡。
  • 指定了full范围,即在每个分区的现有文档范围内对数据进行填充。
  • 指定了200step,即被创建的新文档的altitude间隔为200

聚合输出下面的文档:文章来源地址https://www.toymoban.com/news/detail-828248.html

[
   {
     _id: ObjectId("618c031814fbe03334480475"),
     altitude: 600,
     variety: 'Arabica Typica',
     score: 68.3
   },
   {
     _id: ObjectId("618c031814fbe03334480476"),
     altitude: 750,
     variety: 'Arabica Typica',
     score: 69.5
   },
   { variety: 'Arabica Typica', altitude: 800 },
   {
     _id: ObjectId("618c031814fbe03334480477"),
     altitude: 950,
     variety: 'Arabica Typica',
     score: 70.5
   },
   { variety: 'Gesha', altitude: 600 },
   { variety: 'Gesha', altitude: 800 },
   { variety: 'Gesha', altitude: 1000 },
   { variety: 'Gesha', altitude: 1200 },
   {
     _id: ObjectId("618c031814fbe03334480478"),
     altitude: 1250,
     variety: 'Gesha',
     score: 88.15
   },
   { variety: 'Gesha', altitude: 1400 },
   { variety: 'Gesha', altitude: 1600 },
   {
     _id: ObjectId("618c031814fbe03334480479"),
     altitude: 1700,
     variety: 'Gesha',
     score: 95.5,
     price: 1029
   },
   { variety: 'Arabica Typica', altitude: 1000 },
   { variety: 'Arabica Typica', altitude: 1200 },
   { variety: 'Arabica Typica', altitude: 1400 },
   { variety: 'Arabica Typica', altitude: 1600 }
 ]
在所有分区填充值

下面使用$densify只对每个varietyaltitude字段的间隙进行填充:

db.coffee.aggregate( [
   {
      $densify: {
         field: "altitude",
         partitionByFields: [ "variety" ],
         range: {
            bounds: "partition",
            step: 200
         }
      }
   }
] )

这个例子中的聚合:

  • 根据variety对文档进行分区,创建了两个分组分别是’Arabica Typica’和Gesha咖啡。
  • 指定分区范围,即在每个分区内对数据进行填充处理。
    • 对于Arabica Typica分区,范围是600~900
    • 对于Gesha分区,范围是1250~1700
  • 指定了200step,即被创建的新文档的altitude间隔为200

聚合输出下面的文档:

[
   {
     _id: ObjectId("618c031814fbe03334480475"),
     altitude: 600,
     variety: 'Arabica Typica',
     score: 68.3
   },
   {
     _id: ObjectId("618c031814fbe03334480476"),
     altitude: 750,
     variety: 'Arabica Typica',
     score: 69.5
   },
   { variety: 'Arabica Typica', altitude: 800 },
   {
     _id: ObjectId("618c031814fbe03334480477"),
     altitude: 950,
     variety: 'Arabica Typica',
     score: 70.5
   },
   {
     _id: ObjectId("618c031814fbe03334480478"),
     altitude: 1250,
     variety: 'Gesha',
     score: 88.15
   },
   { variety: 'Gesha', altitude: 1450 },
   { variety: 'Gesha', altitude: 1650 },
   {
     _id: ObjectId("618c031814fbe03334480479"),
     altitude: 1700,
     variety: 'Gesha',
     score: 95.5,
     price: 1029
   }
 ]

到了这里,关于MongoDB聚合:$densify的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MongoDB】--MongoDB聚合Aggregation

    聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类: 单一作用聚合、聚合管道、MapReduce 。 单一作用聚合 :提供对常见聚合过程的简单访问,操作都从单个集合聚合文档 聚合管道操作 :将文档在一个管道处理完毕后,把处理的结

    2024年02月14日
    浏览(40)
  • MongoDB——MongoDB删除系统自带的local数据库

    1.1、linux环境进入mongo客户端 输入 mongo 命令,进入命令行客户端 进入admin库,并登录,查看所有数据库 提升用户权限,然后进入local库并删除local库 然后重新进入admin库,把提升的用户权限降回,再次查看所有数据库 由上图可知,local库已被删除。

    2024年02月06日
    浏览(54)
  • [虚幻引擎 MongoDB Client 插件说明] DTMongoDB MongoDB数据库连接插件,UE蓝图可以操作MongoDB数据库增删改查。

    本插件可以在UE里面使用蓝图操作MongoDB数据库, 对数据库进行查询,删除,插入,替换,更新操作。 插件下载地址在文章最后。 Create MongoDB Client - 创建客户端对象 创建一个 MongoDB 客户端对象。 Connect By Url - 连接到数据库 Url :MongoDB的连接地址。 如 mongoDB://account:password@ip:

    2024年02月14日
    浏览(91)
  • MongoDB数据库从入门到精通系列文章之:MongoDB数据库百篇技术文章汇总

    MongoDB数据库系列文章持续更新中: 更多数据库内容请阅读博主数据库专栏,数据库专栏涵盖了Mysql、SQLServer、PostgreSQL、MongoDB、Oracle、Cassandra等数据库 数据库专栏 文章名称 文章链接 数据库安装部署系列之:部署Mongodb5.0.6高可用集群详细步骤 数据库安装部署系列之:部署M

    2024年02月11日
    浏览(53)
  • Mongodb连接数据库

    npm init   npm i mongoose  const mongoose=require(\\\"mongoose\\\") mongoose.connect(\\\"mongodb://127.0.0.1:27017/user\\\") 说明:mongodb是协议,user是数据库,如果没有会自动创建user数据库 。 node 文件名     mongoose.disconnect()

    2024年02月15日
    浏览(59)
  • mongodb数据库操作

    1、启动mongodb 在mongodb启动命令中 --dbpath 指定mongodb的数据存储路径 --logpath 指定mongodb的日志存储路径 2、停止mongodb 第一步先进入mongo命令行模式 第二步,使用use admin 命令进入admin数据库 第三步,执行 db.shutdownServer()命令 停止服务。代码及显示如下:  2 、导出Mongodb数据 mon

    2024年02月09日
    浏览(50)
  • MongoDb数据库

    1.显示所有数据库: show dbs 2.切换到指定数据库,如果没有则自动创建数据库 use databaseName 3.显示当前所在数据库 db 4.删除当前数据库 use 库名 db.dropDatabase() 1.创建集合 db.createCollection(\\\'集合名称\\\') 2.显示当前数据库中所有集合 show colletions  3.删除某个集合 db.xxx.drop(); 4.重命名集

    2024年02月04日
    浏览(54)
  • MongoDB数据库安装

    MongoDB数据的特点: 面相文档存储的分布式数据库 具有很强的扩展性 支持丰富的查询表达式,很接近于关系性数据库 使用类似于json的结构保存数据,可以轻易的查询到文档中内嵌的对象及数组 首先去官网下载安装包 Download MongoDB Community Server | MongoDB 启动MongoDB数据的服务 可

    2024年02月11日
    浏览(57)
  • MongoDB 数据库详细介绍

    MongoDB(来自“Humongous”,意为巨大的)是一个开源、高性能、无模式(NoSQL)、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。MongoDB 使用 JSON 格式的文档来存储数据,适用于多种应用场景,包括 Web 应用、移动应用、日志存储、大数据等。

    2024年02月12日
    浏览(65)
  • MongoDB:数据库初步应用

    1.MongoDBCompass连接数据库 连接路径:mongodb://用户名:密码@localhost:27017/ 2.创建数据库(集合) MongoDB中数据库被称为集合.  MongoDBCompass连接后,点击红色框加号创建集合,点击蓝色框加号创建文档(数据表) 文档中的数据结构(相当于表中的列)设计不用管,添加数据的时候,自动创建列和数

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包