【问题标题】: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;
    })
    

    运行“假”leadlag 查询:

    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 供您参考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2018-09-01
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多