Используйте идентификатор объекта MongoDB для группировки по дате (ymd) и уникального IP-адреса в день - PullRequest
1 голос
/ 22 марта 2019

Введите:

{_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}

Я весь день возился с этим, чтобы извлечь временную метку из идентификатора монго и использовать ее для ежедневного различного подсчета IP, но я не получаю его ... Я всегда получаю по каждому IP считайте, как в IP в день X был найден 4 раза ... не уникальные IP в день X.

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Под 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
        }
    }
]);
1 голос
/ 22 марта 2019

Вы можете использовать $ toDate и $ dateToString для получения даты из ObjectId, а затем использовать $ 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" }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...