在我的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毫秒。
那么加速这种聚合(如果有的话)的最佳方法是什么?我可以在各个日期部分(日,月,年)创建索引 - 我的测试说不。还有其他想法吗?
答案 0 :(得分:3)
首先需要匹配条件才能使查询生效。在你的程序中,如果你可以获得startDate,endDate,那么首先在这些日期之间过滤记录。然后尝试跟随管道,它将正确使用索引。
An entry with this destination already exists