mongodb $ dayOfYear等效的Unix纪元时间聚合

时间:2014-02-07 02:28:22

标签: mongodb aggregation-framework

是否有一种方法可以按天分组Unix纪元,相当于$ dayOfYear

或聚合浮点数,整数(进入四分位数,数百,数千,%)的过程

尽量避免使用map reduce,但它的一个例子很棒。

2 个答案:

答案 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下运行的等效操作快得多。