【问题标题】:Get count of distinct values in a column grouped by date mongodb获取按日期分组的列中不同值的计数 mongodb
【发布时间】:2016-11-24 00:33:33
【问题描述】:

我正在尝试运行一个 mongodb 查询,对于请求的每一天,它将返回不同列中唯一值的计数。例如,对于 6 月份,查询将返回日期以及该日期 b 列中不同值的计数。任何人都知道如何做到这一点,我尝试了几种不同的方法,但没有成功

下面是几个示例文档,以及输出应该是什么

{
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "IP" : "123.123.123.123",
  "datetime" : ISODate("2016-07-20T10:04:56-05:00")
},
{
  "_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
  "IP" : "110.123.1.2",
  "datetime" : ISODate("2016-07-20T10:04:56-05:00"),
}

输出应该是

{
"date":"2016-07-20",
count:2 -- this is distinct number of IPs for the date above
}

【问题讨论】:

  • 请出示样本文件和预期结果
  • 我已经编辑了这个问题

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

使用aggregate,您可以:

  • 2$project
  • 2$group

这两个项目用于将日-月-年拆分为一个新字段,以便在$group中按其分组

mongo 查询是:

 db.device.aggregate([{
    $project: {
        _id: 1,
        IP: 1,
        day: {
            "$dayOfMonth": "$datetime"
        },
        month: {
            "$month": "$datetime"
        },
        year: {
            "$year": "$datetime"
        }
    }
 }, {
    $project: {
        _id: 1,
        IP: 1,
        datetime: {
            $concat: [{
                    $substr: ["$year", 0, 4]
                },
                "-", {
                    $substr: ["$month", 0, 2]
                },
                "-", {
                    $substr: ["$day", 0, 2]
                }
            ]
        }
    }
 }, {
    $group: {
        _id: {
            date: "$datetime",
            IP: "$IP"
        }
    }
 }, {
    $group: {
        _id: "$_id.date",
        count: {
            $sum: 1
        }
    }
 }])

$sum:1 用于统计你的字段

它会给你这样的东西:

{ "_id" : "2016-7-20", "count" : 2 }
{ "_id" : "2016-8-20", "count" : 1 }

对于输入数据:

> db.device.find()
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c28"), "IP" : "123.123.123.123", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c29"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c25"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c30"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-08-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c12"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-08-20T15:04:56Z") }

【讨论】:

  • 其实等一下,你只是得到所有文档的计数,我希望计数是该日期的不同 IP 的计数
  • 我希望将其分组,以便在您的回答中,例如日期 2016-7-20,计数应为 2,因为那天有 2 个不同的 IP
  • 例如,下面的查询返回 2016 年 6 月 2 日的不同 IP 的计数,我想要一个可以为每个指定的日期范围计算这个的聚合 db.collection.distinct("IP",{datetime:{$gte:ISODate('2016-06-02'),$lt:ISODate('2016-06-03')}}).length
  • 好的,我已经更新了我的帖子。为此需要另外一个$group
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多