MongoDB根据时间aggregate示例

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

需要对下面的集合根据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})


















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1861003 ,如需转载请自行联系原作者



相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
JSON NoSQL MongoDB
MongoDB批量导出导入操作的示例
使用 `mongoexport`和 `mongoimport`工具可以方便地对MongoDB数据库进行批量数据的导出和导入操作。它们支持多种格式和灵活的选项,使得数据迁移、备份和同步变得简单快捷。在实际应用中,根据具体的需求和数据特性选择合适的命令和选项是非常重要的,这将确保数据处理的效率和准确性。
82 1
|
6月前
|
存储 NoSQL MongoDB
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
100 0
|
6月前
|
监控 NoSQL MongoDB
深入MongoDB监控:全面解析命令、实用示例与最佳实践
深入MongoDB监控:全面解析命令、实用示例与最佳实践
175 0
|
SQL NoSQL Unix
13 MongoDB高级 - 聚合 aggregate
13 MongoDB高级 - 聚合 aggregate
75 0
|
SQL NoSQL Unix
MongoDB 聚合aggregate
MongoDB 聚合aggregate
141 0
|
NoSQL 大数据 MongoDB
MongoDB 中Aggregate使用与相关限制
MongoDB 中Aggregate使用与相关限制
261 0
MongoDB 中Aggregate使用与相关限制
|
NoSQL MongoDB
MongoDB aggregate聚合分组查询
MongoDB aggregate聚合分组查询
308 0
|
NoSQL MongoDB Python
Python 操作 mongodb 的简单示例
Python 操作 mongodb 的简单示例
110 0