MongoDB:在$group之后使用$setWindowFields

56lgkhnf  于 2023-04-20  发布在  Go
关注(0)|答案(1)|浏览(138)

我有大约30,000个示例,每个示例都有一个给定的时间戳和大陆。
我想运行一个查询,按月对数据进行分组,返回每个定义的大洲(例如“欧洲”,“亚洲”)每月的示例计数,然后计算每个大洲的累积计数。
该查询是针对Grafana Jmeter 板的,因此它需要是一个聚合操作。
目前,我的查询返回给定行的大陆计数,而不是该行和前面几行的累积计数。
例如,如果欧洲在时间“2020-02-01 0:00:00”为“10”,则cumulativeCount也将为“10”,而不管之前发生了什么。
查询:

targets.targets.aggregate([
    {
        $match: {
            "status.isError": false,
        }
    },
    {
        $group: {
            _id: {
                $dateToString: {
                    format: "%Y-%m-01T00:00:00.000Z", date: { $toDate: "$date_posted" }
                }
            },
            Europe: {
                $sum: {
                    $cond: [
                        { $eq: ["$continent", "Europe"] },
                        1,
                        0
                    ]
                }
            }
        }
    },
    {
        $project: {
            _id: 1,
            Europe: 1
        }
    },
    {
        $sort: {
            "_id": 1
        }
    },
    {
        $addFields: {
            time: { $dateFromString: { dateString: "$_id" } }
        }
    },
    {
        $project: {
            _id: 1,
            time: 1,
            Europe: 1
        }
    },
    {
        $setWindowFields: {
            partitionBy: "$time",
            sortBy: { "time": 1 },
            output: {
                cumulativeCount: {
                    $sum: "$Europe"
                }
            }
        }
    }
])

如果我在分组之前尝试$setWindowFields,查询将出错,因为排序超出了内存限制。

pkwftd7m

pkwftd7m1#

试试这样的方法:

db.collection.aggregate([
  {$match: {"status.isError": false}},
  {$group: {
      _id: {
        date: {
          $dateTrunc: {
            date: "$date_posted",
            unit: "day"
          }
        },
        continent: "$continent"
      },
      count: {$sum: 1}
  }},
  {$project: {
      _id: 0,
      continent: "$_id.continent",
      date: "$_id.date",
      count: 1
  }},
  {$setWindowFields: {
      partitionBy: "$continent",
      sortBy: {"date": 1},
      output: {
        cumulativeCount: {
          $sum: "$count",
          window: {documents: ["unbounded", "current"]}
        }
      }
  }}
])

了解它在playground example上的工作原理

相关问题