$densify(补密)
最后更新:2026-10-09
$densify(补密)
$densify 在字段值之间补充缺失的中间值,生成新的文档序列,常用于时间序列插值——按小时、天等步长把缺失的时间点补齐,数值字段同样支持。需要指定字段、范围 range(步长、单位、边界)和可选的 partitionByFields 分区字段。
| 分类 | 分组与窗口 |
|---|---|
| MongoDB 版本 | 5.1+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $densify: { field: "<字段>", range: { step: <步长>, unit: <单位>, bounds: <范围> }, partitionByFields: [ ... ] } }
⚙️ 参数
| field | 要补密的字段,必须为数字或日期。 |
|---|---|
| range | 定义步长、单位(日期时)与边界范围的对象。 |
| partitionByFields | 分区字段,每组独立补密。 |
返回值:补充缺失值后的文档流
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $densify:把温度数据按小时补全
db.temperature.aggregate([
{ $densify: {
field: 'date',
range: { step: 1, unit: 'hour', bounds: 'full' }
} }
])
运行结果:
// 缺失的小时点被补齐,其他字段原样复制
📌 注意事项
- 只支持数字和日期两种字段类型
- partitionByFields 让每组独立补密
- bounds 可用 full、分区边界或显式数组
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$densify 有什么用?
A时间序列数据缺失时按固定步长补齐时间点,便于绘图或做插值统计。
Qunit 有哪些可选?
A时间单位有 minute、hour、day、week、month、quarter、year 等。
Q$densify 会生成多少文档?
A取决于步长与边界:范围大步长小,文档数可能非常多,需要注意内存。