考虑一个由以下形式的文档组成的集合:
这为我提供了一个很好的结果集,其中包括每天的最高温度:
{
"_id" : ObjectId("55f3600da9fb6e4f937a50a7"),
"timestamp" : ISODate("2010-01-01T08:10:00Z"),
"temperature" : 12.31
}
{
"_id" : ObjectId("55f3600da9fb6e4f937a50a8"),
"timestamp" : ISODate("2010-01-01T08:15:00Z"),
"temperature" : 12.48
}
...
我希望能够找到每天的最高温度,以及发生时间。使用管道聚合很容易实现第一部分:
[{"$group" : {"_id" : {"day": { "$dayOfYear": "$timestamp" }},
"max_temperature": {"$max" : "$temperature"}}},
{"$sort" : {"_id.day":1}}]
这为我提供了一个很好的结果集,其中包括每天的最高温度:
{u'max_temperature': 20.98, u'_id': {u'day': 1}}
{u'max_temperature': 24.15, u'_id': {u'day': 2}}
{u'max_temperature': 22.02, u'_id': {u'day': 3}}
...
但是,我如何获取每个日最大值发生的时间戳呢? 类似于:
{u'max_temperature': 20.98, u'time_of_max': ISODate("2010-01-01T15:11:12"), u'_id': {u'day': 1}}
{u'max_temperature': 24.15, u'time_of_max': ISODate("2010-01-02T16:03:42"), u'_id': {u'day': 2}}
{u'max_temperature': 22.02, u'time_of_max': ISODate("2010-01-03T16:33:59"), u'_id': {u'day': 3}}
...
$max
聚合的文档的方法。 - TomK$max
的作用“相反”。$max
运算符从分组条件“任何地方”找到“最大值”,但你需要“两个属性”出现在“最大值”分组边界处,这意味着必须进行$sort
。 这不是“我的”方法,这是唯一的方法,而没有保留单独的预聚合数据,我们通常出于性能原因而这样做。 - Blakes Seven