优化基于日期的聚合查询

时间:2016-02-17 11:02:54

标签: mongodb optimization aggregation-framework

在我的MongoDB实例(3.2)中,我有各种代表网站视图的文档:

{
  "_id" : ObjectId("56355620e4b0b1fac0c2d85e"),
  "useragent" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
  "requestid" : "c99cef30-5650-493a-aa91-7734b0035fb0",
  "sessionid" : "9cad9a9c-5d85-4665-b833-9fc58aeab20b",
  "datetime" : ISODate("2015-11-01T00:00:29.356Z"),
  "ipaddress" : "192.168.1.1",
  "url" : "http://www.somepage.com"
}

现在我想使用这些信息来制作某种形式的月度访问报告(因此,您在1日获得了1000名访客,在第2名获得了1500名访客等)。所以我使用以下聚合查询:

db.data.aggregate([
  { $project: { day: {$dayOfMonth: '$datetime'}, month: {$month: '$datetime'}, year: {$year: '$datetime'} }},
  { $match : { month : 11, year : 2015 }},
  { $group : {
    _id : { month: "$month", day: "$day"},
    count: { $sum : 1 }
  }},
  { $sort : { "_id.day" : 1 }}
]);

效果很好,需要大约一秒才能运行。但是现在我想尽可能加快速度。所以首先想到我尝试添加一个索引:

db.data.createIndex("datetime": 1);

但实际上我的查询增加了100毫秒。

那么加速这种聚合(如果有的话)的最佳方法是什么?我可以在各个日期部分(日,月,年)创建索引 - 我的测试说不。还有其他想法吗?

1 个答案:

答案 0 :(得分:3)

首先需要匹配条件才能使查询生效。在你的程序中,如果你可以获得startDate,endDate,那么首先在这些日期之间过滤记录。然后尝试跟随管道,它将正确使用索引。

An entry with this destination already exists