首页 > 解决方案 > 按范围内的日期获取计数(MongoDB 聚合管道)

问题描述

我有 MongoDB 文档,例如

[{_id: ObjectId(...), 
  ...,
  meta: Object
    city: 'New York',
    state: 'NY',
    first_seen: 2020-01-01T00:00:00.000+00:00,
    last_seen: 2020-12-31T00:00:00.000+00:00},
 {_id: ObjectId(...),
  ...,
  meta: Object
    city: 'New York',
    state: 'NY',
    first_seen: 2020-03-01T00:00:00.000+00:00,
    last_seen: 2020-05-30T00:00:00.000+00:00},
 ...]

我正在尝试aggregate在 PyMongo 中编写一个管道,因为我认为这是最快的方法,它将执行以下操作:

  1. 按城市/州分组
  2. 获取该组中的日期范围(该组min(meta.first_seen)中的所有文档到该组中max(meta.last_seen)的所有文档)
  3. 对于日期范围内的每个日期,获取表示该日期的所有文档的计数(例如,如果文档具有 meta.first_seen: 2020-01-01 和 meta.last_seen: 2020-01-03,那么它将贡献+1 以计数 {2020-01-01, 2020-01-02, 2020-01-03} 中的每个日期。

对于每个城邦,这里的输出将类似于每日人口。例子:

{'state': 'NY', 
 'city': 'New York', 
 'population': {'2020-01-01': 25, 
                '2020-01-02': 26, 
                '2020-01-03': 26, 
                ..., 
                '2021-04-26': 31}}

这是我的功能外壳:

def pop_stats(item):
    ins = [
        {'$match': {'meta.state': item['state'],'meta.city': item['city']}},
    ]
    item.update(list(db.aggregate(ins))[0])
    return item

我需要弄清楚如何最有效地构建这个管道。

标签: pythonmongodbaggregatepymongopipeline

解决方案


推荐阅读