是否有一种方法可以按天分组Unix纪元,相当于$ dayOfYear
或聚合浮点数,整数(进入四分位数,数百,数千,%)的过程
尽量避免使用map reduce,但它的一个例子很棒。
答案 0 :(得分:1)
通过使用$ mod和$ divide运算符,您几乎可以在聚合管道中使用Unix时间秒。
数学是Unix时间秒/ 86400将秒转换为自Epoch以来的天数。然后模拟每年365.25的结果(每4个跳跃一次)。
因此使用秒的$ dayOfYear的完整聚合几乎与
一样简单db.MyCollection.aggregate( {$project : {"day" : {$mod : [ {$divide : ["$unix_seconds", 86400] } , 365.25] } } }, { $group : { _id : "$day" , num : { $sum : 1 } } } , {$sort : {_id : 1}} )
以上添加了一年中连续日的排序。
问题是$ mod运算符返回整数和余数。并且无法舍入或截断其余部分。因此,结果按整数和余数分组。
{
"_id" : 235.1864887063916,
"num" : 1
},
{
"_id" : 235.24300889818738,
"num" : 1
},
{
"_id" : 235.60299520864623,
"num" : 3
},
{
"_id" : 235.66453935674085,
"num" : 1
},
{
"_id" : 235.79900382758004,
"num" : 1
},
{
"_id" : 235.80265845312474,
"num" : 1
},
..显然我们只需要整数
{
"_id" : 235,
"num" : 8
},
什么是好的是$ trunc或modula只返回整个($ modw),而mod只返回mongo中的其余($ modr)运算符。
答案 1 :(得分:0)
JavaScript具有Date对象,可用于MapReduce函数的任何服务器端JavaScript处理。
您似乎了解$dayOfYear中的aggregation pipeline运算符。处理日期有other operators。
除非您的需求非常具体,否则应该使用汇总管道。它非常灵活,在大多数情况下会比在mapReduce下运行的等效操作快得多。