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)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB查询操作限制返回字段的方法

《MongoDB入门教程》第13篇 限制返回结果数量

《MongoDB入门教程》第13篇 限制返回结果数量

《MongoDB入门教程》第13篇 限制返回结果数量

MongoDB高级查询详细

Mongodb获取结果数