$shift

$shift 运算符是聚合管道中使用的窗口运算符,用于在分区内移动值并返回移位值。 这在需要比较排序分区中相邻文档的值的操作中非常有用。

Syntax

{
  $shift: {
    output: <expression>,
    by: <number>,
    default: <expression>
  }
}

参数

参数 Description
output 指定将移动其值的字段或表达式。
by 指定要移动值的位置数。 正值向前移动,负值向后移动。
default 指定当位移操作超出边界时要返回的默认值。

示例

示例 1:转移销售数据

此示例演示如何用于 $shift 计算已排序的销售数据分区中每个文档的上一个销售值。

db.collection.aggregate([
  {
    $setWindowFields: {
      partitionBy: "$sales.salesByCategory.categoryName",
      sortBy: { "sales.salesByCategory.totalSales": 1 },
      output: {
        previousSales: {
          $shift: {
            output: "$sales.salesByCategory.totalSales",
            by: -1,
            default: null
          }
        }
      }
    }
  }
])

示例 2:转移促销事件日期

此示例通过按 startDate 对所有事件进行排序来计算上一个促销事件的开始日期。 由于我们希望将所有事件一起处理,因此我们不会分区。

db.promotionEvents.aggregate([
  {
    $setWindowFields: {
      partitionBy: null,
      sortBy: { "promotionalDates.startDate": 1 },
      output: {
        previousStartDate: {
          $shift: {
            output: "$promotionalDates.startDate",
            by: -1,
            default: null
          }
        }
      }
    }
  }
])