【问题标题】:Tips for Aggregating MongoDB Time Trend Data over groups with varying date ranges在具有不同日期范围的组中聚合 MongoDB 时间趋势数据的提示
【发布时间】:2021-05-29 23:58:10
【问题描述】:

我有一个 MongoDB 集合,其中包含以下文档:

{'date': 2020-01-01T00:00:00.000+00:00, 'population': 110, 'state': 'NY', 'start': 2020-01-01T00:00:00.000+00:00, 'end': 2021-05-26T00:00:00.000+00:00},
{'date': 2020-01-02T00:00:00.000+00:00, 'population': 112, 'state': 'NY', 'start': 2020-01-01T00:00:00.000+00:00, 'end': 2021-05-26T00:00:00.000+00:00},
...
{'date': 2020-03-15T00:00:00.000+00:00, 'population': 119, 'state': 'NY', 'start': 2020-01-01T00:00:00.000+00:00, 'end': 2021-05-26T00:00:00.000+00:00},
{'date': 2020-03-16T00:00:00.000+00:00, 'population': 131, 'state': 'NY', 'start': 2020-01-01T00:00:00.000+00:00, 'end': 2021-05-26T00:00:00.000+00:00},
{'date': 2020-03-17T00:00:00.000+00:00, 'population': 138, 'state': 'NY', 'start': 2020-01-01T00:00:00.000+00:00, 'end': 2021-05-26T00:00:00.000+00:00},
...
{'date': 2020-03-16T00:00:00.000+00:00, 'population': 31, 'state': 'AL', 'start': 2020-03-16T00:00:00.000+00:00, 'end': 2021-05-24T00:00:00.000+00:00},
{'date': 2020-03-17T00:00:00.000+00:00, 'population': 31, 'state': 'AL', 'start': 2020-03-16T00:00:00.000+00:00, 'end': 2021-05-24T00:00:00.000+00:00},
...

每个文档代表数据中存在的给定区域中的日期和人口,以及该区域存在的第一个和最后一个记录日期。

我希望能够可视化这些数据的聚合时间趋势。在这个简单的示例中,我将在 y 轴上可视化人口(在给定日期的所有人口的总和)和在 x 轴上的日期。 问题是我只需要可视化一个全面的集合。例如,由于 AL 的数据仅从 2020-03-16 开始,因此我不希望我的人口可视化在添加新状态时跳到该日期。

我不想及时向后插值;我宁愿只推断给定时间范围内的可行集,然后在该综合子集上进行聚合。

在给定开始日期和结束日期的情况下,是否有一种简单的方法可以识别具有连续数据的状态集,并在此之上汇总人口?

例如,如果我的输入是

first: '2020-03-16'
last: '2021-05-24'

我的输出会是这样的:

{'date': 2020-03-16T00:00:00.000+00:00, 'setsize': 2, 'set': ['NY', 'AL'], 'population': 162},
{'date': 2020-03-17T00:00:00.000+00:00, 'setsize': 2, 'set': ['NY', 'AL'], 'population': 169},
...

但是,如果我的输入是

first: '2020-03-15'
last: '2021-05-24'

我的输出将只包括纽约,因为在第一个日期没有 AL 的数据,所以我的输出将是

{'date': 2020-03-15T00:00:00.000+00:00, 'setsize': 1, 'set': ['NY'], 'population': 119},
{'date': 2020-03-16T00:00:00.000+00:00, 'setsize': 1, 'set': ['NY'], 'population': 131},
{'date': 2020-03-17T00:00:00.000+00:00, 'setsize': 1, 'set': ['NY'], 'population': 138},
...

【问题讨论】:

    标签: python mongodb aggregation-framework pymongo


    【解决方案1】:

    你可以使用聚合

    • $match有条件获取文件
    • $group 按日期分组

    这里是代码

    db.collection.aggregate([
      {
        "$match": {
          $expr: {
            $and: [
              { $gt: [ "$date", "2020-03-15" ]},
              { $lt: [ "$date", "2021-05-24" ] }
            ]
          }
        }
      },
      {
        "$group": {
          "_id": "$date",
          "setSize": { "$sum": 1 },
          "set": { $push: "$state" },
          population: { $sum: "$population" }
        }
      }
    

    ])

    工作Mongo playground

    注意:您没有提到日期格式。所以我将日期作为字符串。如果您有日期格式,您可以简单地将其转换为日期-> 字符串或字符串-> 日期

    【讨论】:

    • 这似乎不是我想要的。我只想要一个时间范围内的最大交集,所以我从不希望返回的结果在其日期数组元素的“set”字段中具有不同的值。
    • 请问我上面的查询有什么问题,有时我可以纠正它
    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2017-10-17
    • 2019-07-29
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多