【问题标题】:How to perform lead and lag in MongoDB如何在 MongoDB 中执行领先和滞后
【发布时间】:2022-01-17 03:39:33
【问题描述】:
我正在使用 STudio 3T,我有这样的查询:
select [Dashbo],lead([Dashbo]) over(order by [Entered Date])
from ATest_prevback;
这给了我和错误。如何在 MongoDB 中执行此操作?谁能举个例子?
谢谢,
阿迪
【问题讨论】:
标签:
mongodb
mongodb-query
aggregation-framework
pymongo
studio3t
【解决方案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 供您参考。