MongoDB:限制 $gt 查询的结果(来自 pymongo)
Posted
技术标签:
【中文标题】MongoDB:限制 $gt 查询的结果(来自 pymongo)【英文标题】:MongoDB: Limiting results from a $gt query (from pymongo) 【发布时间】:2011-01-18 11:27:54 【问题描述】:我正在从 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"
如果有人请求过去 30 天的每日数字,这将意味着(在此示例中)“下载”公关的最大数量。日。这是当天的最后一条记录。
通过使用collection.find("dt": "$gt": datetime_obj_30_days_ago)
,我当然可以得到所有的行,这不是很合适。因此,我正在寻找一种仅返回给定时间段内最后一天的方法。
有人告诉我 group()
可能是要走的路,但我不太明白如何让它在这种情况下工作。
任何提示,指针将不胜感激!
【问题讨论】:
【参考方案1】:您可以使用group 执行此操作。在您的示例中,您需要提供一个 javascript 函数来计算密钥(以及 reduce 函数),因为您只需要 datetime 字段的日期组件。这应该有效:
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) '
)
请记住,仍然会在服务器上而不是客户端上对过去一个月进行线性扫描。 可能单独选择每天的最大值会更快。
【讨论】:
非常感谢,Coady – 你扩大了我对group
的理解。 :-)以上是关于MongoDB:限制 $gt 查询的结果(来自 pymongo)的主要内容,如果未能解决你的问题,请参考以下文章