如何在 MongoDB 中执行超前和滞后
How to perform lead and lag in MongoDB
我正在使用 STudio 3T,我有这样的查询:
select [Dashbo],lead([Dashbo]) over(order by [Entered Date])
from ATest_prevback;
这给我带来了错误。如何在 MongoDB 中执行此操作?有人可以给我举个例子吗?
谢谢,
阿迪
很遗憾,不可能。
解决方法:使用计算数据创建 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"]}}}
])
从MongoDBv5.0+开始,可以使用$shift in $setWindowFields.
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供您参考。
我正在使用 STudio 3T,我有这样的查询:
select [Dashbo],lead([Dashbo]) over(order by [Entered Date])
from ATest_prevback;
这给我带来了错误。如何在 MongoDB 中执行此操作?有人可以给我举个例子吗?
谢谢, 阿迪
很遗憾,不可能。
解决方法:使用计算数据创建 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"]}}}
])
从MongoDBv5.0+开始,可以使用$shift in $setWindowFields.
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供您参考。