按日期分组在mongodb [英] group by dates in mongodb

查看:232
本文介绍了按日期分组在mongodb的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在使用mongodb,而且我必须按日期分组点击次数(我想分组数据15天)。



我在mongodb中以以下格式存储数据。

  {
_id:ObjectId(4d663451d1e7242c4b68e000),
date:2010年12月27日18:51:22 GMT + 0000(UTC) ,
topic:abc,
time:18:51:22
}
{
_id:ObjectId 4 bbb时间:bb $ b日期:星期一12月27日18:51:23 GMT + 0000(UTC),
主题 18:51:23
}

我想分组主题点击次数:abc by days(15天)..我知道如何分组,但是如何按日期分组存储在我的数据库中



我正在寻找结果以下格式

  [
{
date:date in log,
点击 :9
},
{
date:date in log,
click:19
},
]

我已经编写了代码,但只有日期是字符串(代码在这里 http://pastebin.com/2wm1n1ix
...请指导我如何分组

解决方案

使用Mongo聚合框架的新回答



在这个问题被问及回答后,10gen发布Mongodb版本2.2与聚合框架,现在是更好的方式来做这种查询。这个查询有点具有挑战性,因为你想按日期分组,存储的值是时间戳,所以你必须做一些事情来将时间戳转换成匹配的日期。为了示例的目的,我将只写一个获得正确计数的查询。

  db.col.aggregate(
{ $ group:{_id:{$ dayOfYear:$ date},
click:{$ sum:1}}}

这将返回以下内容:

  [
{
_id:144,
click:165
},
{
_id:275,
click:12
}
]

您需要使用 $ match 将查询限制为您感兴趣的日期范围, $ project 重命名 _id date 。您如何将日期转换为日期留作读者的练习。 : - )



10gen有一个方便的 SQL到Mongo Aggregation转换图表值得书签。还有一个关于日期聚合运算符的具体文章。 p>

得到一点心仪,你可以使用:

  db.col.aggregate([
{$ group:{
_id:{
$ add:[
{$ dayOfYear:$ date},
{$ multiply:
[400,{$ year:$ date}]
}
]},
点击:{$ sum:1},
first:{$ min:$ date}
}
},
{$ sort:{_id:-1}},
{$ limit:15} ,
{$ project:{date:$ first,click:1,_id:0}}
])

这将为您提供最新的15天内,并在日期字段内的每一天返回一些日期时间。例如:

  [
{
click
date:ISODate(2013-05-11T02:33:45.526Z)
},
{
click:702,
date :ISODate(2013-05-08T02:11:00.503Z)
},
...
{
click:814,
日期:ISODate(2013-04-25T00:41:45.046Z)
}
]


I am working on a project in which I am tracking number of clicks on a topic.

I am using mongodb and I have to group number of click by date( i want to group data for 15 days).

I am having data store in following format in mongodb

{ 
   "_id" : ObjectId("4d663451d1e7242c4b68e000"), 
  "date" : "Mon Dec 27 2010 18:51:22 GMT+0000 (UTC)", 
  "topic" : "abc", 
  "time" : "18:51:22"
}
{ 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
    "date" : "Mon Dec 27 2010 18:51:23 GMT+0000 (UTC)", 
    "topic" : "bce", 
    "time" : "18:51:23"
}

i want to group number of clicks on topic:abc by days(for 15 days)..i know how to group that but how can I group by date which are stored in my database

I am looking for result in following format

[
  {
    "date" : "date in log",
    "click" : 9 
  },  
  {
    "date" : "date in log",
    "click" : 19
  },  
]

I have written code but it will work only if date are in string (code is here http://pastebin.com/2wm1n1ix) ...please guide me how do I group it

解决方案

New answer using Mongo aggregation framework

After this question was asked and answered, 10gen released Mongodb version 2.2 with an aggregation framework, which is now the better way to do this sort of query. This query is a little challenging because you want to group by date and the values stored are timestamps, so you have to do something to convert the timestamps to dates that match. For the purposes of example I will just write a query that gets the right counts.

db.col.aggregate(
   { $group: { _id: { $dayOfYear: "$date"},
               click: { $sum: 1 } } }
   )

This will return something like:

[
    {
        "_id" : 144,
        "click" : 165
    },
    {
        "_id" : 275,
        "click" : 12
    }
]

You need to use $match to limit the query to the date range you are interested in and $project to rename _id to date. How you convert the day of year back to a date is left as an exercise for the reader. :-)

10gen has a handy SQL to Mongo Aggregation conversion chart worth bookmarking. There is also a specific article on date aggregation operators.

Getting a little fancier, you can use:

db.col.aggregate([
  { $group: {
      _id: {
        $add: [
         { $dayOfYear: "$date"}, 
         { $multiply: 
           [400, {$year: "$date"}]
         }
      ]},   
      click: { $sum: 1 },
      first: {$min: "$date"}
    }
  },
  { $sort: {_id: -1} },
  { $limit: 15 },
  { $project: { date: "$first", click: 1, _id: 0} }
])

which will get you the latest 15 days and return some datetime within each day in the date field. For example:

[
    {
        "click" : 431,
        "date" : ISODate("2013-05-11T02:33:45.526Z")
    },
    {
        "click" : 702,
        "date" : ISODate("2013-05-08T02:11:00.503Z")
    },
            ...
    {
        "click" : 814,
        "date" : ISODate("2013-04-25T00:41:45.046Z")
    }
]

这篇关于按日期分组在mongodb的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆