[MongoDB] 分组统计时间 aggregate,group,distinct

开发中有些按日期记录的记录需要各种维度的统计,按天,按月,按年,按小时,。。分组统计,还有些需要对字段去重统计,在之前的  [Mongo] 按时间分组统计(group时间格式化) 中用group实现了按天的统计,不过使用 new Date()方法会有些坑,今天看了下aggregate中,使用 aggregate 来写个时间统计。

tips: aggregate 挺复杂,弄明白了再做笔记,现在只是根据需求来查询。


数据结构还是:
/* 0 */
{
  "_id" : ObjectId("541fcc51c6c36038bc6b81cd"),
  "url" : "http://wifi21.com/",
  "addtime" : ISODate("2014-08-19T00:15:02Z")
}

/* 1 */
{
  "_id" : ObjectId("541fcc51c6c36038bc6b81ce"),
  "url" : "http://meiwen.me/src/index.html",
  "addtime" : ISODate("2014-08-19T00:15:07Z")
}
...


按月统计pv值(相当于group)

db.msds_accessrecord.aggregate([
    {$group: {
        _id: {
            "$month": "$addtime"
        }, 
     pv: {$sum: 1}}
    },
    {$sort: {"_id": 1}}
]);

统计结果

/* 0 */
{
    "result" : [ 
        {
            "_id" : 8,
            "pv" : 583
        }, 
        {
            "_id" : 9,
            "pv" : 1399
        }
    ],
    "ok" : 1
}

按月统计url值,重复url去掉,这里只是做个演示,可能统计没什么意义 (相当于group+distinct)
db.msds_accessrecord.aggregate([
    {$group: {
        _id: {
            "month": {"$month": "$addtime"},
            "url": "$url"
        }
    }},
    {$group: {_id:"$_id.month", uv: {$sum: 1}}},
    {$sort: {"_id":1}}
]);
这里用到了管道,排序,聚合


统计结果

/* 0 */
{
    "result" : [ 
        {
            "_id" : 8,
            "uv" : 41
        }, 
        {
            "_id" : 9,
            "uv" : 134
        }
    ],
    "ok" : 1
}


引用:

聚合使用方法: http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/#db.collection.aggregate

日期聚合函数: http://docs.mongodb.org/manual/reference/operator/aggregation-date/


本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/39932081


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用MongoDB进行去重,并根据某个字段进行时间范围内的重复值去除。具体过程如下: 1. 首先,确保已连接到MongoDB数据库,并选择要操作的集合。 2. 使用聚合管道操作符`$group`将重复的文档进行分组。在该操作符中,设置`_id`为想要去重的字段,如时间字段。 例如,假设要去重的字段为`timestamp`,则聚合管道可以如下设置: ```javascript { $group: { _id: "$timestamp", count: { $sum: 1 }, documents: { $push: "$$ROOT" } } } ``` 3. 对于每个分组,通过检查文档数量`count`是否大于1来确定是否存在重复值。如果存在重复值,则在分组的`documents`字段中会存储重复的文档。 4. 使用聚合管道操作符`$project`将重复的文档按照时间进行排序,并选择保留其中的一个文档。 例如,可以按照时间字段进行排序,并保留其中的第一个文档: ```javascript { $project: { _id: 0, document: { $arrayElemAt: ["$documents", 0] } } } ``` 5. 最后,使用聚合管道操作符`$replaceRoot`将选择的文档作为根文档,并返回结果。 完整的MongoDB聚合查询示例代码如下: ```javascript db.collection.aggregate([ { $group: { _id: "$timestamp", count: { $sum: 1 }, documents: { $push: "$$ROOT" } } }, { $match: { count: { $gt: 1 } } }, { $sort: { _id: 1 } }, { $project: { _id: 0, document: { $arrayElemAt: ["$documents", 0] } } }, { $replaceRoot: { newRoot: "$document" } } ]) ``` 通过以上步骤,我们可以使用MongoDB进行去重,并根据某个字段去除指定时间范围内的重复值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值