汇总具有不同日期范围的组的 MongoDB 时间趋势数据的提示
Tips for Aggregating MongoDB Time Trend Data over groups with varying date ranges
我有一个 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 年 3 月 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'
我的输出将只包括 NY,因为第一个日期没有 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},
...
您可以使用聚合
$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" }
}
}
])
注意:您没有提到日期格式。所以我把日期作为字符串。如果你有日期格式,你可以简单地将它转换为 date-> string 或 string-> date
我有一个 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 年 3 月 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'
我的输出将只包括 NY,因为第一个日期没有 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},
...
您可以使用聚合
$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" }
}
}
])
注意:您没有提到日期格式。所以我把日期作为字符串。如果你有日期格式,你可以简单地将它转换为 date-> string 或 string-> date