MongoDB - 查询在过去几小时内创建的所有文档,并按分钟查询?

时间:2013-11-21 21:58:29

标签: mongodb

从阅读各种文章,我相信这应该是可能的,但我不确定从哪里开始。

这就是我要做的事情:

我想运行一个查询,它会在最后一小时内找到所有文档createAt,并按分钟对所有文档进行分组,并且因为每个文档都有一个推文值,如5,6或19,所以将它们添加为每一分钟都提供一笔款项。

以下是该集合的示例:

{
  "createdAt": { "$date": 1385064947832 },
  "updatedAt": null,
  "tweets": 47,
  "id": "06E72EBD-D6F4-42B6-B79B-DB700CCD4E3F",
  "_id": "06E72EBD-D6F4-42B6-B79B-DB700CCD4E3F"
}

这可以在mongodb中做到吗?

@ zero323 - 我首先尝试将最后一小时分组如下:

db.tweetdatas.group( {
   key: { tweets: 1, 'createdAt': 1 },
   cond: { createdAt: { $gt: new Date("2013-11-20T19:44:58.435Z"), $lt: new Date("2013-11-20T20:44:58.435Z") } },
   reduce: function ( curr, result ) { },
   initial: { }
} )

但是这只会在时间范围内返回所有推文,这在技术上就是我想要的,但现在我希望每分钟对它们进行分组,并将每一分钟的推文总和加起来。

@almypal

以下是我正在使用的查询,基于您的建议:

db.tweetdatas.aggregate(
    {$match:{ "createdAt":{$gt: "2013-11-22T14:59:18.748Z"}, }},
    {$project: { "createdAt":1, "createdAt_Minutes": { $minute : "$createdAt" }, "tweets":1, }},
    {$group:{ "_id":"$createdAt_Minutes", "sum_tweets":{$sum:"$tweets"} }}
)

但是,它显示了这个回复:

{ "result" : [ ], "ok" : 1 }

更新:来自 @almypal 的回复正在运行。显然,在上面的示例中输入日期不起作用。当我从Node运行此查询时,在shell中,我认为将var日期转换为字符串会更容易,并在shell中使用它。

1 个答案:

答案 0 :(得分:3)

使用汇总如下:

  var lastHour = new Date();
  lastHour.setHours(lastHour.getHours()-1);

  db.tweetdatas.aggregate(
    {$match:{ "createdAt":{$gt: lastHour}, }},
    {$project: { "createdAt":1, "createdAt_Minutes": { $minute : "$createdAt" }, "tweets":1, }},
    {$group:{ "_id":"$createdAt_Minutes", "sum_tweets":{$sum:"$tweets"} }}
  )    

,结果就像这样

 {
    "result" : [
    {
        "_id" : 1,
        "sum_tweets" : 117
    },
    {
        "_id" : 2,
        "sum_tweets" : 40
    },
    {
        "_id" : 3,
        "sum_tweets" : 73
    }
],
"ok" : 1
 }

其中_id对应于特定分钟,sum_tweets是该分钟内的推文总数。