【已解决】mongoose 日期聚合的问题
发布于 10 年前 作者 heixiaoshan 12219 次浏览 最后一次编辑是 8 年前

##文档

{
   "_id": ObjectId("53c4190a4572483830000053"),
   "sendfrom": "joy",
   "sendto": "iphone",
   "sendtitle": "新趋势",
   "user": "han",
   "create_at": ISODate("2014-07-14T17: 53: 14.499Z") 
}

文档是这样的要我如何使用聚合函数Aggregation 根据日期来分组啊 请大神指导,指导。谢谢啦。

最后采用方式:

Sendinfo.getallday = function(user, callback) {
	var date = new Date();
	var firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
	var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
	var group={
//		key: {user:1,create_at:1},
		keyf: function(sendinfos) {
				var date = new Date(sendinfos.create_at);
				var dateKey = (date.getMonth()+1)+"/"+date.getDate()+"/"+date.getFullYear()+'';
				return {'day':dateKey,'user':sendinfos.user};//返回值
					        
				},//格式化日期
		cond: {'user':user}, //查询条件   		cond: {'user':user, 'create_at': { $gt:firstDay,$lt:lastDay}}, //查询条件
		initial: {count:0}, //初始值
		reduce: function(obj, prev) {prev.count++;},
		finalize:{}
	};
	SendinfoModel.collection.group(
		group.keyf,
	    group.cond, //查询条件
	    group.initial, //初始值
	   group.reduce,
	   group.finalize,
	   true,//reduce
	   function(err,sendinfos){
	   	  if (err) {
	            return callback(err);
	          }
	   	  console.log("new Date(1):"+new Date().setDate(1)+",new Date(31):"+new Date().setDate(31)+","+sendinfos);
	   	  callback(null,sendinfos);
	   }
	);
  
};

13 回复

我觉得是 mapreduce 利用 create_at 字段来做

function map(){

var date = this.create_at; var year = date.getUTCFullYear(); var month = date.getUTCMonth(); month = month + 1; var day = date.getUTCDate();

var dateStr  = year + "-" + month  + "-" + day;
emit(dateStr, this);

} function reduce(key, values){ return {date:key, values:values}; } db.xxx.mapReduce(map, reduce, {out:“xxx_map_reduce”})

我这里要求的好像是每天,每个用户的分组总数,用mapReduce,好像有些问题

@heixiaoshan Aggregation的本质就是map reduce看你自己的实际需求

@chloe 噢。感觉那个太高深了。目前吸收不了。哈哈。等以后再琢磨下。多谢啦

@chloe @heixiaoshan aggregation 是特定情况下的 mapreduce,当需求自定义程度高时,mapreduce 通用并易用得多。

@alsotang 牛哥,你们公司还招人不

@chloe ??一直招人啊,公司那么大…每时每刻都在找人…

@alsotang 嗯。有时间要好好理解理解mapreduce

@alsotang 好吧,应该是你们部门或者项目组

@chloe 来份简历看看~alsotang@gmail.com

回到顶部