以mongodb生成日期范围

时间:2015-04-15 12:01:15

标签: mongodb aggregation-framework nosql

我有一个像

这样的文件
    {
       a : "123",
       b : [
             { 
               "start" : "2015-01-03",
               "end"   : "2015-01-05",
               "name"  : "xyz"
             },
             { 
               "start" : "2015-01-15",
               "end"   : "2015-01-17",
               "name"  : "abc"
             }
            ] 
    },
    {
       a : "456",
       b : [
             { 
               "start" : "2015-01-04",
               "end"   : "2015-01-05",
               "name"  : "xyzd"
             }
            ] 
     }

我试图像每天一样计算b的数量,

2015-01-03 count: 1
2015-01-04 count: 2
2015-01-05 count: 2
2015-01-15 count: 1
2015-01-16 count: 1
2015-01-17 count: 1

如果日期扩展,可以通过简单聚合完成。是否可以扩展聚合的日期范围?

编辑:基本上对于给定的范围我想扩展该范围并得到每天的计数,除非它与另一个范围重叠,否则它将是一个。

1 个答案:

答案 0 :(得分:1)

让我们检查以下情况,如果您的文档的日期类似于ISODate格式,请按以下方式进行操作

[
{
    "_id": ObjectId("552e71ec3420d7797e5ae682"),
    "a": "123",
    "b": [
        {
            "start": ISODate("2015-01-03T00:00:00Z"),
            "end": ISODate("2015-01-05T00:00:00Z"),
            "name": "xyz"
        },
        {
            "start": ISODate("2015-01-15T00:00:00Z"),
            "end": ISODate("2015-01-17T00:00:00Z"),
            "name": "abc"
        }
    ]
},
{
    "_id": ObjectId("552e72063420d7797e5ae683"),
    "a": "456",
    "b": [
        {
            "start": ISODate("2015-01-04T00:00:00Z"),
            "end": ISODate("2015-01-05T00:00:00Z"),
            "name": "xyzd"
        }
    ]
}
]

现在如果您想要计算所有start日期,那么只需使用以下查询

db.collectionName.aggregate([
{
    "$unwind": "$b"
},
{
    "$group": {
        "_id": "$b.start",
        "count": {
            "$sum": 1
        }
    }
},
{
    "$project": {
        "startDate": "$_id",
        "count": "$count",
        "_id": 0
    }
}
])

以上用于结束日期的内容只需在组中替换 $b.start to $b.end 然后显示结束日期计数

如果您想从给定范围中找出start日期计数,然后使用以下查询,请假设start来自ISODate("2015-01-03T00:00:00Z")ISODate("2015-01-04T00:00:00Z")范围

db.collectionName.aggregate([
{
    "$unwind": "$b"
},
{
    "$match": {
   // check here date range matching documents
        "$and": [
            {
                "b.start": {
                    "$gte": ISODate("2015-01-03T00:00:00Z")
                }
            },
            {
                "b.start": {
                    "$lte": ISODate("2015-01-04T00:00:00Z")
                }
            }
        ]
    }
},
{
    "$group": {
        "_id": "$b.start",
        "count": {
            "$sum": 1
        }
    }
},
{
    "$project": {
        "startDate": "$_id",
        "count": "$count",
        "_id": 0
    }
}
])