如何在MongoDB setWindowFields中基于其他文档均值计算新字段
MongoDB 滑动窗口均值求和实现方案
以下是满足需求的聚合管道实现,能够计算指定滑动窗口内的均值并与当前price求和,仅当窗口包含5个文档时输出结果字段:
db.collection.aggregate([ { $setWindowFields: { partitionBy: null, sortBy: { _id: 1 }, output: { slidingMean: { $avg: "$price", window: { documents: [-4, "current"] } }, windowSize: { $count: {}, window: { documents: [-4, "current"] } } } } }, { $addFields: { field_new: { $cond: { if: { $eq: ["$windowSize", 5] }, then: { $add: ["$price", "$slidingMean"] }, else: "$$REMOVE" } } } }, { $project: { slidingMean: 0, windowSize: 0 } } ])
各阶段说明
- $setWindowFields:
- 无分区设置(
partitionBy: null),将整个集合作为一个处理组;按_id升序排序保证窗口顺序正确。 slidingMean:通过$avg计算当前文档及之前4个文档(共5个)的price均值。windowSize:统计当前窗口内的文档数量,用于判断是否满足5个文档的计算条件。
- 无分区设置(
- $addFields:
- 使用条件判断,仅当窗口大小为5时,计算
price与窗口均值的和并赋值给field_new;不满足条件时移除该字段。
- 使用条件判断,仅当窗口大小为5时,计算
- $project:移除中间计算产生的
slidingMean和windowSize字段,仅保留原始字段和最终结果字段。
执行后将得到期望的输出结果:
[ { "_id": 1, "price": 1 }, { "_id": 2, "price": 2 }, { "_id": 3, "price": 3 }, { "_id": 4, "price": 4 }, { "_id": 5, "price": 5, "field_new": 8 }, { "_id": 6, "price": 6, "field_new": 10 } ]
内容的提问来源于stack exchange,提问作者AnujGeek
相关产品推荐
相关产品推荐

