查找聚合的特定结果/再次过滤聚合的结果?



我现在正在处理的部分数据是一个日期时间戳。我想找到当前日期的所有数据,然后遍历我的15分钟间隔时间戳数组,将每个数据点添加到我的PyPlot

我的初始聚合是:

qryData = collection.aggregate([
{
"$addFields":
{
"year": {"$year": {"$dateFromString": {"dateString": "$timestamp", "format": "%Y-%m-%d %H:%M:%S"}}},
"month": {"$month": {"$dateFromString": {"dateString": "$timestamp", "format": "%Y-%m-%d %H:%M:%S"}}},
"day": {"$dayOfMonth": {"$dateFromString": {"dateString": "$timestamp", "format": "%Y-%m-%d %H:%M:%S"}}},
"hour": {"$hour": {"$dateFromString": {"dateString": "$timestamp", "format": "%Y-%m-%d %H:%M:%S"}}},
"minute": {"$minute": {"$dateFromString": {"dateString": "$timestamp", "format": "%Y-%m-%d %H:%M:%S"}}},
}
},
{
"$match":
{
"year": dateToChart.year,
"month": dateToChart.month,
"day": dateToChart.day,
"name": city
}
}
])

此聚合实现为我获取当前日期的所有对象。我认为我可以在循环中说一些类似qryData.find({"hour": hour})的东西来查看我的聚合结果以寻找匹配的小时值,但我认为qryDataCommand Cursor,并且我找不到任何方法来从中过滤数据。

我尝试在for循环中运行我的聚合,并将我的hourminute值添加到聚合的$match部分,但是每次从整个数据库中查询/聚合都会使操作变得非常慢。

我想到的另一种方法是遍历qryData,然后遍历我的时间值数组,如果值匹配,将它们添加到数组中,例如:

for results in qryData:
for time in times:
if qryData["hour"] = time.hour:
filteredData.append(results)

虽然这个方法确实有效,但感觉不像是正确或最好的方法,所以我想知道我应该如何从聚合的返回中找到特定的结果?

聚合查询将比集合扫描更糟糕。它必须首先加载集合中的每个文档,然后提取timestamp字符串,并对该字符串执行5次单独的日期转换。

如果你每隔1分钟就有一年的数据,那就需要读取大约50万份文档,并执行大约250万次日期计算才能通过第一阶段。

如果日期字符串的格式为"YYYY-MM-DD HH:MM:SS"它们自然会按照时间顺序按照字典顺序排序。

这意味着你可以找到1个Sep的所有条目

{$match:{
timestamp:{
$gte: "2021-09-01",
$lt: "2021-09-02"
}
}}

这个改动将完全取消日期计算。

如果您还在timestamp字段上创建索引,它将能够扫描索引,并且只需要获取与当天匹配的1440个文档,而不是读取集合中的每个文档。

如果您确实需要日期的各个部分,以便稍后在管道中使用,请使用$dateToParts一次性提取它们。

最新更新