如何在 MongoDB 中执行领先和滞后
Posted
技术标签:
【中文标题】如何在 MongoDB 中执行领先和滞后【英文标题】:How to perform lead and lag in MongoDB 【发布时间】:2022-01-17 03:39:33 【问题描述】:我正在使用 STudio 3T,我有这样的查询:
select [Dashbo],lead([Dashbo]) over(order by [Entered Date])
from ATest_prevback;
这给了我和错误。如何在 MongoDB 中执行此操作?谁能举个例子?
谢谢, 阿迪
【问题讨论】:
【参考方案1】:很遗憾,不可能。
解决方法:使用计算数据创建Materialized view。
在 MongoDB Shell 中运行:
var prev = null;
db.ATest_prevback.find().sort(field:1).forEach(function(curr)
db.materialized_view.insert(curr:curr.field, prev:(prev ? prev.field : 0))
prev = curr;
)
运行“假”lead
和 lag
查询:
db.materialized_view.aggregate([
$match:$expr:$eq:["$curr", "$prev"]
])
【讨论】:
【参考方案2】:从MongoDB v5.0+开始,可以在$setWindowFields中使用$shift来完成。
db.collection.aggregate([
"$setWindowFields":
"partitionBy": null,
"sortBy":
"entered_date": 1
,
"output":
lag:
$shift:
output: "$Dashbo",
by: -1,
default: "Not available"
,
lead:
$shift:
output: "$Dashbo",
by: 1,
default: "Not available"
])
这里是Mongo playground 供您参考。
【讨论】:
以上是关于如何在 MongoDB 中执行领先和滞后的主要内容,如果未能解决你的问题,请参考以下文章