Mongodb不支持把时间戳转成date类型?
发布于 7 年前 作者 JarvisQJ 13157 次浏览 来自 问答

Mongodb不支持把时间戳转成date类型? untitled1.png

数据库里面存的时间全是时间戳,有些数据需要按日期统计的时候就尴尬了。请大家帮想想办法。

11 回复

可以存为时间格式,我记得有个项目是ISOdate格式,一般都用时间戳

@nobody 现在问题是项目已经做完了,发现时间戳无法做统计。比如,查找某个资源某月份每日访问量

@qujinxiong 之前我也遇到过类似的问题,我选择了冗余字段来表示,比如timestamp 为时间戳,同时冗余了3个字段,month_stamp应对当月0天0时0分0秒的时间戳,day_stamp对应当天0点0分0秒的时间戳,hour_stamp对应当天小时的0分0秒时间戳,然后每次根据这个维度查值是,直接group_by+各种计算= aggregate,所以我觉着你可以跑个程序,专门根据已有时间戳来跑这个冗余字段,然后根据分组来计算

@Fov6363 目前我能想到的办法和你类似:再多存一个对应的date类型时间,就可以用$year/$month/$day+$group这几个操作符来处理了。因为之前的数据不能删,我还得想办法把所有时间戳转成date类型另存一个字段

@qujinxiong 可以不使用nodejs统计,使用java 或 go 这些语言统计试试?

map reduce 试过吗?

@Jaymi66 这个木有试过,感觉那个好难。一直没用过

@nobody 我另起项目,专门做统计?有点太费事了

{ ’$group’: { ’_id’: { ’$dateToString’: { ‘format’: ‘%Y-%m-%d’, ‘date’: { ’$add’: [ new Date(0), ’$createTime’, ], }, }, }, ‘count’: {’$sum’: 1}, }, },

@qujinxiong 当然是可以滴,不过要注意姿势

@aojiaotage 正解!激动!感谢! 为了后来者方便看,我编辑一下格式:

db.getCollection('videos').aggregate([
  {
	  '$match':{
		  '_id':1
	  }
  },
  {
	  '$group': {
		  '_id': {
			  '$dateToString': {
				  'format': '%Y-%m-%d',
				  'date': {
					  '$add': [
						  new Date(0),
						  '$createTime'
					  ]
				  }
			  }
		  },
		  'count': {'$sum': 1}
	  }
}]);

主要是利用$add操作符,把日期和时间戳相加,得到另一个日期。

回到顶部