$setWindowFields (v5.0+) adds SQL-style window functions to MongoDB aggregation. It computes values over a sliding or fixed window of documents without collapsing them into groups — all input documents are preserved in output.
db.sensorReadings.aggregate([
{ $sort: { sensorId: 1, timestamp: 1 } },
{
$setWindowFields: {
partitionBy: "$sensorId",
sortBy: { timestamp: 1 },
output: {
movingAvgTemp: {
$avg: "$temperature",
window: {
documents: [-4, 0]
}
}
}
}
}
])
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: "$sensorId",
sortBy: { timestamp: 1 },
output: {
cumulativeReadings: {
$sum: { $literal: 1 },
window: { documents: ["unbounded", "current"] }
},
runningTotalTemp: {
$sum: "$temperature",
window: { documents: ["unbounded", "current"] }
}
}
}
}
])
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: "$sensorId",
sortBy: { timestamp: 1 },
output: {
hourlyAvgTemp: {
$avg: "$temperature",
window: {
range: [-3600000, 0],
unit: "millisecond"
}
}
}
}
}
])
db.leaderboard.aggregate([
{
$setWindowFields: {
sortBy: { score: -1 },
output: {
rank: { $rank: {} },
denseRank: { $denseRank: {} },
docNumber: { $documentNumber: {} }
}
}
}
])