Azure Cosmos DB for MongoDB vCore 上的$densify使用情况

$densify聚合管道中的阶段用于填充值序列中缺失的数据点。 它通过基于指定的字段、范围和步骤生成缺失值来帮助创建更完整的数据集。 这在时序数据分析等方案中特别有用,需要填充数据点中的差距,以确保准确的分析。

语法

{
  $densify: {
    field: <field>,
    range: {
      step: <number>,
      unit: <string>, // Optional, e.g., "hour", "day", "month", etc.
      bounds: [<lowerBound>, <upperBound>] // Optional
    },
    partitionByFields: [<field1>, <field2>, ...] // Optional
  }
}

参数

参数 DESCRIPTION
field 执行 densification 的字段。
range.step 用于生成缺失值的步长大小。
range.unit (可选)步骤大小的单位,如时间单位(例如“hour”、“day”)。
range.bounds (可选)指定缩小范围(下限和上限)。
partitionByFields (可选)用于对数据进行 densification 分组的字段。

例子

示例 1:取消时序数据集

以下管道填充日期字段中缺少的天数:

db.aggregate([
    {
      $documents: [
        { date: new ISODate("2024-01-01"), value: 10 },
        { date: new ISODate("2024-01-03"), value: 15 }
      ]
    },
    {
      $densify: {
        field: "date",
        range: {
          step: 1,
          unit: "day",
          bounds: "full"
        }
      }
    }
  ]);

此查询将返回以下文档。

[
  { date: ISODate("2024-01-01T00:00:00.000Z"), value: 10 },
  { date: ISODate("2024-01-02T00:00:00.000Z") },
  { date: ISODate("2024-01-03T00:00:00.000Z"), value: 15 }
]

示例 2:Densify 数值数据

以下管道填充字段中缺少的数值 sales.fullSales

db.aggregate([
    {
      $documents: [
        { level: 1, score: 10 },
        { level: 3, score: 30 }
      ]
    },
    {
      $densify: {
        field: "level",
        range: {
          step: 1,
          bounds: [1, 5] 
        }
      }
    }
  ]);

此查询将返回以下文档。

[
  { level: 1, score: 10 },
  { level: 2 },
  { level: 3, score: 30 },
  { level: 4 }
]

局限性

下表总结了与 MongoDB 聚合管道中$densify阶段关联的关键限制和行为:

类别 条件/行为
字段限制 - 如果任何文档都有日期值且unit,则出错。
- 如果任何文档具有数值且已指定unit出错。
- 字段名称$. 开头。 用于 $project 重命名它。
partitionByFields - 任何字段的计算结果为 非字符串 值。
- 字段名称$. 开头
range.bounds - 下限 定义起始值,而不考虑现有文档。
- 下限是非独占的。
- 上限是独占的
- $densify 不会筛选出边界外的文档。