MongoDB聚合运算符:$linearFill

文章目录

  • MongoDB聚合运算符:$linearFill
    • 语法
    • 使用
      • 对比`$fill`和`$linearFill`
    • 举例
      • 使用线性插值填充缺失值
      • 在单个阶段中使用多种填充方法

MongoDB聚合运算符:$linearFill

$linearFill聚合运算符在一个窗口中基于附近字段的值使用线性插值填充null和缺失字段。

语法

{ $linearFill: <expression> }

使用

$linearFill聚合运算符在一个窗口中基于附近字段的非空值使用线性插值填充null和缺失字段。附近字段值由$setWindowFields的排序顺序决定。

  • $linearFill按比例填充空值和缺失值,跨越周围非空值之间的数值范围,要确定缺失字段的值,$linearFill使用:

    • 周围非空值的差值。
    • 要填充周围值之间的空字段的数量。
  • $linearFill如果根据$setWindowFields中指定的排序顺序,前面和后面都有非空值,则可以填充多个连续的空值。
    如果集合包含这些文档:

    { index: 0, value: 0 },
    { index: 1, value: null },
    { index: 2, value: null },
    { index: 3, value: null },
    { index: 4, value: 10 }
    

    使用$linearFill后为了填充空值,文档变成:

    { index: 0, value: 0 },
    { index: 1, value: 2.5 },
    { index: 2, value: 5 },
    { index: 3, value: 7.5 },
    { index: 4, value: 10 }
    
  • 前后都没有非空值的null仍为null

注意:

  • 要使用$linearFill必须要使用sortBy字段对数据进行排序。
  • 当使用线性填充窗口功能时,如果单个分区中的sortBy字段中有任何重复值,$setWindowFields将返回错误。

对比$fill$linearFill

使用$linearFill填充缺失字段值时,可以:

  • $fill阶段用{ method: "linear" }。当使用$fill阶段时,在输出中指定的字段与用作源数据的字段相同。
  • $setWindowFields中使用$linearFill操作符。可以为与用作源数据的字段不同的字段设置值。

举例

使用下面的脚本创建stock集合,包含了每小时跟踪的单个公司的股票价格信息:

db.stock.insertMany( [{time: ISODate("2021-03-08T09:00:00.000Z"),price: 500},{time: ISODate("2021-03-08T10:00:00.000Z"),},{time: ISODate("2021-03-08T11:00:00.000Z"),price: 515},{time: ISODate("2021-03-08T12:00:00.000Z")},{time: ISODate("2021-03-08T13:00:00.000Z")},{time: ISODate("2021-03-08T14:00:00.000Z"),price: 485}
] )

集合中的某些文档缺少price字段

使用线性插值填充缺失值

$setWindowFields阶段内部,使用$linearFill线性插值填充缺失的price字段值:

db.stock.aggregate( [{$setWindowFields:{sortBy: { time: 1 },output:{price: { $linearFill: "$price" }}}}
] )

在本例中:

  • sortBy: { time: 1 }time字段从最早到最晚的升序对文档进行排序。
  • output指定了:
    • price作为要填充的缺失值的字段
    • { $linearFill: "$price" }作为缺失字段的值。$linearFill基于序列中price周围的值使用线性插值来填充缺失的price的值。

输出结果:

[{_id: ObjectId("620ad555394d47411658b5ef"),time: ISODate("2021-03-08T09:00:00.000Z"),price: 500},{_id: ObjectId("620ad555394d47411658b5f0"),time: ISODate("2021-03-08T10:00:00.000Z"),price: 507.5},{_id: ObjectId("620ad555394d47411658b5f1"),time: ISODate("2021-03-08T11:00:00.000Z"),price: 515},{_id: ObjectId("620ad555394d47411658b5f2"),time: ISODate("2021-03-08T12:00:00.000Z"),price: 505},{_id: ObjectId("620ad555394d47411658b5f3"),time: ISODate("2021-03-08T13:00:00.000Z"),price: 495},{_id: ObjectId("620ad555394d47411658b5f4"),time: ISODate("2021-03-08T14:00:00.000Z"),price: 485}
]

在单个阶段中使用多种填充方法

当使用$setWindowFields阶段填充缺失值时,可以为与填充的字段不同的字段设置值,所以可以在单个$setWindowFields阶段中使用多个填充方法,并将结果输出到不同的字段中。

下面的聚合管道使用线性插值和最后观测前移法填充缺失的price字段的值:

db.stock.aggregate( [{$setWindowFields:{sortBy: { time: 1 },output:{linearFillPrice: { $linearFill: "$price" },locfPrice: { $locf: "$price" }}}}
] )

在本例中:

  • sortBy: { time: 1 }time字段从最早到最晚的升序对文档进行排序。
  • output指定了:
    • linearFillPrice作为要填充的目标字段
      • { $linearFill: "$price" }LinearFillPrice字段的值。$linearFill基于序列中price周围的值使用线性插值来填充缺失的price的值。
    • locfPrice作为要填充的目标字段
      • { $locf: "$price" }locfPrice字段的值。locf代表最后一次观察结果。$locf使用序列中前一个文档中的值填充缺失的price的值。

结果输出:

[{_id: ObjectId("620ad555394d47411658b5ef"),time: ISODate("2021-03-08T09:00:00.000Z"),price: 500,linearFillPrice: 500,locfPrice: 500},{_id: ObjectId("620ad555394d47411658b5f0"),time: ISODate("2021-03-08T10:00:00.000Z"),linearFillPrice: 507.5,locfPrice: 500},{_id: ObjectId("620ad555394d47411658b5f1"),time: ISODate("2021-03-08T11:00:00.000Z"),price: 515,linearFillPrice: 515,locfPrice: 515},{_id: ObjectId("620ad555394d47411658b5f2"),time: ISODate("2021-03-08T12:00:00.000Z"),linearFillPrice: 505,locfPrice: 515},{_id: ObjectId("620ad555394d47411658b5f3"),time: ISODate("2021-03-08T13:00:00.000Z"),linearFillPrice: 495,locfPrice: 515},{_id: ObjectId("620ad555394d47411658b5f4"),time: ISODate("2021-03-08T14:00:00.000Z"),price: 485,linearFillPrice: 485,locfPrice: 485}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka开机自启脚本

1.虚拟机编辑定时任务 crontab -e reboot /usr/local/startShell.sh 2.编辑自定义启动脚本 #!/bin/sh# 进入kafka安装目录 cd /usr/local/kafka_2.12-3.7.0# 初始化java变量 export JAVA_HOME/usr/local/jdk1.8.0_401 export JRE_HOME${JAVA_HOME}/jre export PATH$PATH:${J…

多视图三维重建-SFM简介

背景 掌握传统的多视图三维重建基本流程 总体流程 多视图三维重建的Pipieline如下图&#xff0c;总共分为四个步骤&#xff1a; 拍摄场景多视角的图像建立这些图像之间的联系&#xff08;Data Association&#xff09;SFM稀疏重建MVS稠密重建 Data Association 建立图像…

向开发板上移植ip工具:将ip工具移植到开发板系统中

一. 简介 前面一篇文章对 ip工具源码进行了交叉编译&#xff0c;生成了ip工具。文章如下&#xff1a; 向开发板上移植ip工具&#xff1a;交叉编译 ip工具-CSDN博客 本文对生成的 ip工具进行移植&#xff0c;即移植到开发板系统中&#xff0c;并确定是否可用。 二. 向开发板…

Nagios工具

一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具&#xff0c;能有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;交换机路由器等网络设置&#xff0c;打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员&#xff0c;在状态恢复后…

CY2300相位对齐时钟乘法器

这份文件是关于Cypress Semiconductor Corporation生产的CY2300型号的Phase-Aligned Clock Multiplier&#xff08;相位对齐时钟乘法器&#xff09;的技术手册。以下是该文件的核心内容概述&#xff1a; 产品特性&#xff1a; 4倍频输出配置。单一锁相环&#xff08;PLL&#x…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应&#xff0c;通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下&#xff0c;…

6.1物联网RK3399项目开发实录-驱动开发之ADC驱动(wulianjishu666)

物联网嵌入式开发源码例程&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1B3oqq5QBhN-VmTFt9CI-7A?pwd2ihg ******************************************************************************************* ADC 使用 简介 AIO-3399J 开发板上的 AD 接口有两种…

服务未注册到nacos通过gateway转发的配置

1.现实场景 服务需要部署到内网阿里云&#xff0c;通过edas可以进行服务的自动部署和注册&#xff0c;但是有些服务需要调用同一环境中的C命令&#xff0c;于是通过建立ECS服务器&#xff0c;进行jar包的部署&#xff0c;那么在新建的ECS部署的jar包如何通过gateway转发&#…

5-规范设计(下):commit信息风格迥异、难以阅读,如何规范?

我们在做代码开发时&#xff0c;经常需要提交代码&#xff0c;提交代码时需要填写 Commit Message&#xff08;提交说明&#xff09;&#xff0c;否则就不允许提交。 所以在 Go 项目开发时&#xff0c;一个好的 Commit Message 至关重要&#xff1a; 可以使自己或者其他开发人…

基于SSM的百货中心供应链管理系统设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套百货中心供应链管理系统有管理…

u盘插在电脑上显示要格式化磁盘怎么办

咨询&#xff1a;“U盘插入电脑&#xff0c;提示需要先格式化 才可使用。对于此种情况&#xff0c;在不需要格式化的情况下&#xff0c;是否可以恢复U盘内容&#xff1f;谢谢” 当我们尝试将U盘插入电脑时&#xff0c;有时会遇到一个令人困惑的提示&#xff1a;电脑要求我们格式…

Game Audio Programming

音频编程时游戏开发中最容易忽略&#xff0c;学习资源又是很少的环节。接下来&#xff0c;你将和我探索人耳的工作机制。 what is sound? 我们可以解释电视机是如何通过眼睛传递视觉信息的&#xff0c;但却往往无法对听觉信息做出类似的解释。 对声音的科学研究被称为声学&…

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器&#xff0c;交换机之间通过Trunk链路相连&#xff0c;路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…

【测试开发学习历程】Python数据类型:字符串-str(下)

目录 5.5 format()方法 5.6 count()方法 5.7 join()方法 5.8 replace()方法 5.9 split()方法 5.10 rstrip()/lstrip()/strip() 方法 5.11 capitalize()方法 5.12 upper() 5.13 lower() 5.14 title() 5.15 endswith()方法 5.16 startswith()方法 5.17 以is开头的方…

跃然纸上的灵感再现,手绘风格的开源绘图白板工具:Excalidraw

Excalidraw&#xff1a;即绘即思&#xff0c;直观呈现未来流程图&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在撰写文章或构建演示案例的过程中&#xff0c;为了增强视觉表现力和信息传达深度&#xff0c;适时融入图表或图形显得至关重要。Excalidraw作为一款基于…

pyrhon 中__call__的用法

使用背景 一般情况下类方法的调用是通过先创建类对象再通过a.b()的方式来调用&#xff0c;但是如果类中只有一个方法或者一个方法的使用频率非常高&#xff0c;那么就可以为这个方法命名为__call__来简化调用。 call 存在__call__方法的类对象被称为可调用对象&#xff0c;它…

深度选择器/deep/、::v-deep、:deep的区别

在 Vue.js 和某些其他前端框架中&#xff0c;/deep/、::v-deep 和 :deep 都是用于穿透组件作用域的选择器。它们的主要目的是允许开发者在父组件中直接选择并样式化子组件内部的元素&#xff0c;即使这些元素被封装在子组件的作用域内。 /deep/ /deep/ 是一个深度选择器&#…

nginx符号链接介绍

符号链接&#xff08;Symbolic link&#xff09;是一种特殊类型的文件&#xff0c;它是指向另一个文件或目录的符号。在 Nginx 中&#xff0c;符号链接通常用于启用或禁用特定站点的配置文件。 要查看是否存在符号链接以及符号链接指向的目标文件或目录&#xff0c;您可以使用…

【生活】相机/图像各参数

文章目录 专业模式图片编辑-滤镜实体滤镜软件模拟滤镜 图片编辑-增强曝光亮度对比度饱和度自然饱和度色温色调高光阴影HSL色调分离褪色颗粒锐化晕影清晰度暗角 参考 专业模式 第一个参数WB是白平衡&#xff0c;调节色彩的。 第二个是对焦F&#xff0c;近距离拍摄物体&#xf…

怎么在循环List的时候删除List的元素

怎么在循环List的时候删除List的元素 1. 先给出结论 任何时候都不要在 for 循环中删除 List 集合元素 2. 为什么在 for 循环中删除 List 集合元素是错误的 在 for 循环中删除 List 集合元素的问题主要是因为循环的迭代器和 List 集合的元素索引之间的冲突。在使用 for 循环遍历…