设为首页 收藏本站
查看: 854|回复: 0

[经验分享] MongoDB根据时间aggregate示例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-13 10:15:36 | 显示全部楼层 |阅读模式
需要对下面的集合根据LastUpdate按天分组累加TranslateFields值。

1
2
3
4
5
6
rs_test:SECONDARY> db.new_result.find();   
{ "_id" : ObjectId("57fb0756e31f84a56ed41889"), "LastUpdate" : ISODate("2016-09-02T01:35:02.471Z"), "TranslateFields" : 9 }   
{ "_id" : ObjectId("57fb0756e31f84a56ed4188a"), "LastUpdate" : ISODate("2016-09-05T11:13:28.344Z"), "TranslateFields" : 10 }   
{ "_id" : ObjectId("57fb0756e31f84a56ed4188b"), "LastUpdate" : ISODate("2016-09-05T09:26:41.016Z"), "TranslateFields" : 33 }   
{ "_id" : ObjectId("57fb0756e31f84a56ed4188c"), "LastUpdate" : ISODate("2016-09-02T13:34:50.114Z"), "TranslateFields" : 12 }   
{ "_id" : ObjectId("57fb0756e31f84a56ed4188d"), "LastUpdate" : ISODate("2016-08-26T03:49:52.369Z"), "TranslateFields" : 17 }




如果是在SQL Server里,分组统计应该像这样写:
1
2
3
4
SELECT CONVERT(varchar,LastUpdate,112),SUM(TranslateFields)
  FROM dbo.new_result
  GROUP BY CONVERT(varchar,LastUpdate,112)
  ORDER BY 1;




那么在MongoDB里,有3种聚合方法:group、aggregate和mapReduce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//2.6版本aggregate方法   
db.new_result.aggregate(   
      {   
        $group : {   
           _id : { year: { $year: "$LastUpdate" }, month: { $month: "$LastUpdate" }, day: { $dayOfMonth: "$LastUpdate" } },   
           totalTime: { $sum: "$TranslateFields" }   
        }   
      },   
      {   
        $sort : {   
           "_id.year": 1, "_id.month": 1, "_id.day": 1   
        }   
      }   
)





1
2
3
4
5
6
7
8
9
10
11
12
13
14
//3.0版本aggregate方法   
db.new_result.aggregate(   
      {   
        $group : {   
           yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$LastUpdate" } },   
           totalTime: { $sum: "$TranslateFields" }   
        }   
      },   
      {   
        $sort : {   
           "yearMonthDay": 1   
        }   
      }   
)




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//group方法   
db.new_result.group({   
keyf : function(doc){   
  var date = new Date(doc.LastUpdate);   
  var dateKey = ""+date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();   
  return {'day':dateKey};   
},     
initial : {"time":0},     
reduce : function(doc, prev){   
        prev.time += doc.TranslateFields;   
    },     
finalize : function Finalize(out) {   
    return out;   
}   
}   
});



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//先存为日期   
//1   
db.tmp_result.find({"value.Status":3},{"value.TranslateFields":1,"value.LastUpdate":1}).forEach(   
    function(item){   
         db.new_result.save({"LastUpdate":item.value.LastUpdate.getFullYear()+"-"+   
             (item.value.LastUpdate.getMonth()+1)+"-"+   
             item.value.LastUpdate.getDate(),   
             "TranslateFields":item.value.TranslateFields});   
    }   
)   
//2   
db.new_result.aggregate(   
      {   
        $group : {   
           _id:"$LastUpdate",   
           totalTime: { $sum: "$TranslateFields" }   
        }   
      }   
     ,{"$sort":{"_id":1}}   
)




对于aggregate方法,最好在$group之前$match,减少数据量,如果过滤的键上有索引,查询也会走索引。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
db.TranslateTicket.aggregate(   
{   
    "$match":   
    {   
         "LastUpdate": {"$gte":ISODate("2016-06-19T00:00:00.000Z"), "$lt":ISODate("2016-09-19T00:00:00.000Z")},   
         "Status": 3   
    }   
},   
{   
    "$group":   
    {   
      _id : { month: { $month: "$LastUpdate" }, day: { $dayOfMonth: "$LastUpdate" }, year: { $year: "$LastUpdate" } },   
     totalTime: { $sum: "$CharactersCount" }   
    }   
},   
{   
    "$sort":   
    {   
        "_id.year":1,"_id.month":1,"_id.day":1   
    }   
}   
)




这种情况,最好在创建如下索引:
1
db.TranslateTicket.createIndex({“LastUpdate”:1,”Status”:1},{background:1})






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-285318-1-1.html 上篇帖子: CentOS6.5下安装Mongodb3.2.4 下篇帖子: mongodb页面展示列表时遇到展示慢的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表