$densify (聚合)
定义
$densify
新版本5.1.
在文档序列中创建新文档,其中某个字段的某些值缺失。
您可以使用
$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
阶段接受包含以下字段的文档
字段 | 必要性 | 描述 |
---|---|---|
必填 | 要加密的字段。指定 不包含指定 要在嵌套文档或数组中指定 有关限制,请参阅 | |
可选 | 作为组合键以分组文档的字段集合。在 如果您省略此字段, 有关示例,请参阅 Densifiction with Partitions. 有关限制,请参阅 | |
必填 | 指定数据如何加密的对象。 | |
必填 | 您可以指定
如果
如果
如果
| |
必填 | 在每份文档中增加 field 值的数量。 如果指定了 range.unit,则 | |
如果 field 是日期,则为必填。 |
行为和限制
field
限制
partitionByFields
限制
$densify
如果 partitionByFields 数组中的任何字段名称出错
计算结果不是字符串值。
以
$
开头。
range.bounds
行为
如果 range.bounds 是一个数组
输出顺序
$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 单位。单位:小时
通过小时对时间戳
字段进行密集化。范围:[ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ]
设置了密集化的时间范围。
在以下输出中,$densify
阶段填充了00:00:00
到08: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
来密集化每个咖啡品种
的海拔
字段
db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "full", step: 200 } } } ] )
示例聚合
按
品种
分区文档,为阿拉比卡Typica
和Gesha
咖啡创建一个分组。指定一个
全
范围,意味着数据将密集化到每个分区中现有文档的全范围内。指定一个
步长
为200
,意味着在海拔
间隔为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 }, { 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
创建的文档

较暗的方块代表集合中的原始文档。
较亮的方块代表使用
$densify
创建的文档。
在每个分区内加密值
此示例使用 $densify
来仅加密每个 variety
中的 altitude
字段的间隔。
db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "partition", step: 200 } } } ] )
示例聚合
按
品种
分区文档,为阿拉比卡Typica
和Gesha
咖啡创建一个分组。指定一个
partition
范围,意味着数据在每个分区内加密。对于
Arabica Typica
分区,范围是600
-950
。对于
Gesha
分区,范围是1250
-1700
。
指定一个
步长
为200
,意味着在海拔
间隔为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 } ]
此图像展示了使用$densify
创建的文档

较暗的方块代表集合中的原始文档。
较亮的方块代表使用
$densify
创建的文档。