Mongo日期聚合预定义范围

时间:2015-08-21 12:38:17

标签: mongodb mongodb-query aggregation-framework

我正在尝试在mongodb中的日期字段上执行聚合功能,我有兴趣在预定义的日期范围内获取计数结果。

例如:

  • 最近24小时(x)

  • 24 - 48小时(年)

  • 超过48(z)

这甚至可能吗?或者我是否必须执行以排序顺序返回所有文档的查询,然后将它们分成代码中的桶?

谢谢!

1 个答案:

答案 0 :(得分:1)

这对于所选日期范围的至少某些限制通常更有意义,但基本原则是使用$cond运算符返回编码匹配的值的逻辑条件。在这种情况下,它将值传递给$sum以进行累积:

var now = new Date(),
    oneDay = ( 1000 * 60 * 60 * 24 ),
    24hours = new Date( now.valueOf() - oneDay ),
    48hours = new Date( 24hours.valueOf() - oneDay );

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "24hours": {
            "$sum": {
                "$cond": [
                    { "$lt": [ 24hours, "$datefield" ] },
                    1,
                    0
                ]
            }
        },
        "48hours": {
            "$sum": {
                "$cond": [
                    "$and": [
                          { "$gt": [ 24hours, "$datefield" ] },
                          { "$lte": [ 48hours, "$datefield" ] }
                    ],
                    1,
                    0
                ]
            }
        },
        "gt48hours": { 
            "$sum": {
                "$cond": [
                    { "$gt": [ 48hours, "$datefield" ] },
                    1,
                    0
                ]
            }
        }
    }}
])

这里$cond采用逻辑表达式来评估它的第一个参数,并返回“{1}}的”第二个“参数或true的”第三个“参数。基本上是false1取决于条件是否得到满足。

注意这里$gt的逻辑形式和聚合框架所使用的逻辑形式不同于同一命名的“查询”运算符,因为它们采用两个参数的数组,其中“第一个”参数大于或小于(如所选)“第二”参数。在这种情况下,每个测试值都针对actaul“datefield”,表示要与文档中的字段进行比较。这些符合条件的地方返回0或不符合条件。

这意味着对于为每个条件选择的范围内定义的日期,计数要么在数据满足条件的情况下累积,要么不是。这就是你如何得到每个时期的不同计数。