使用MongoDB ObjectID来按日期分组(ymd)和每天的唯一IP

时间:2019-03-22 14:05:11

标签: mongodb aggregation-framework

输入:

{_id:ObjectID(123),ip:'123.123.123.123'}
{_id:ObjectID(123),ip:'123.123.123.123'}
{_id:ObjectID(124),ip:'123.123.123.124'}
{_id:ObjectID(125),ip:'123.123.123.125'}

输出:

{2019-03-20: 1}
{2019-03-21: 1}
{2019-03-22: 1}

我整天忙于从mongo ID中提取时间戳,并使用它对IP进行每日的独立计数,但我没有得到...我总是以每个IP结尾计数,例如在X天的IP被发现了4次...不是X天的唯一IP。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用$toDate$dateToStringObjectId获取日期,然后使用$addToSet获取每天的唯一IP地址。在最后一步中,您需要$size才能获得ip数组的长度:

db.collection.aggregate([
    {
        $group: {
            _id: { $dateToString: { date: { $toDate: "$_id" }, format: '%Y-%m-%d' } },
            ip: { $addToSet: "$ip" }
        }
    },
    {
        $project: {
            _id: 0,
            date: "$_id",
            ipCount: { $size: "$ip" }
        }
    }
])

答案 1 :(得分:1)

在MongoDB v3.8下,以下功能有效-感谢@mickl

db.getCollection('data').aggregate([
    {
        $group: {
            "_id" : {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": "$_id"
                }
            },
            "ip": { $addToSet: "$ip" }
        }
    },
    {
        $project: {
            _id: 0,
            date: "$_id",
            ipCount: {
                $size: "$ip"
            }
        }
    },
    {
        $sort: {
            date: -1
        }
    }
]);