我是从一个Web服务收集一些统计数据,并将其存储一个收藏。数据类似于此(但具有多个字段):

{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"}
{…}
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"}

如果有人请求日常号码最近三十天内,这将意味着的最高金额(在这个例子中)“下载”公关。天。这是一天中的最后一条记录。

通过使用collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}),我当然得到所有的行,这是不很适合。所以我在寻找一种方式来只返回最后一天的在一定期间。

有人告诉我,group()可能是要走的路,但我不是很了解如何让它在这种情况下工作。

任何提示,指针将是非常赞赏!

有帮助吗?

解决方案

您可以使用做到这一点。在您的例子你需要提供一个JavaScript函数来计算密钥(以及精简函数),因为你只想要日期时间字段的日期部分。这应该工作:

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }',
    condition={'dt': {'$gt': datetime_obj_30_days_ago}},
    initial={'downloads': 0},
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }'
)

请记住,仍然没有过去一个月的线性扫描,就在服务器上而不是在客户端上。这是可能简单地分别选择每一天的最大值为快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top