2015-02-16 8 views
0

это вид документа, у меня есть:Mongoid Группировка по дате

{ 
    event_type: 'click', 
    created_at: '2015-02-15 10:00:00', 
    user_id: 100 
} 

Мне нужно просуммировать уникальных пользователей в день с event_type = нажмите. Чтобы получить что-то вроде:

{ 
    count: 320, 
    date: '2015-02-15' 
} 

{ 
    count: 451, 
    date: '2015-02-16' 
} 

(обратите внимание на формат даты)

Я пробовал много разных вещей, которые я нашел на SO, это один почти работал для меня: Best way to group by date with Mongoid Я просто не мог выяснить, как изменить его, чтобы сделать именно то, что мне нужно.

Это сырье запрос, который почти делает то, что я хочу достичь с Mongoid:

db.events.aggregate([ 
    {$match: {event_type: 'click', created_at: { 
    $gte: ISODate('2015-01-01T00:00:00.000Z'), 
    $lt: ISODate('2016-01-01T00:00:00.000Z') 
    }}}, 
    {$group: { 
     _id: {user_id: '$user_id', account_id: '$account_id', created_at: { 
      day: { $dayOfMonth: '$created_at' }, 
      month: { $month: '$created_at' }, 
      year: { $year: '$created_at'} 
     }}, 
     'count': {'$sum': 1} 
     } 
    }, 
    {$sort: {created_at: -1}}, 
]) 

Любые предложения?

+0

- это дата вашего имени 'created_at' - дата или строка ISO? – Yogesh

+0

created_at is date ISO – Udi

ответ

2

в Монго 2,8 $dateToString обеспечивает средство для преобразования даты ISO в формат строка так ниже запроса может решить вашу проблему

db.collectionName.aggregate({ 
    "$match": { 
    "event_type": "click" 
    } 
}, { 
    "$project": { 
    "yearMonthDay": { 
     "$dateToString": { 
      "format": "%Y-%m-%d", 
      "date": "$created_at" 
     } 
    }, 
    "user_id": "$user_id" 
    } 
}, { 
    "$group": { 
    "_id": { 
     "user_id": "$user_id", 
     "date": "$yearMonthDay" 
    } 
    } 
}, { 
    "$group": { 
    "_id": "$_id.date", 
    "count": { 
     "$sum": "$_id.user_id" 
    } 
    } 
}, { 
    "$project": { 
    "date": "$_id", 
    "count": "$count", 
    "_id": 0 
    } 
}) 

В выше запросе первой группы создать группу даты мудрой и user_id и вторая группа снова рассчитывать сумму user_id в соответствии с датой

+0

спасибо. Я использую v2.6, поэтому я попытаюсь найти способ сделать что-то подобное с текущей версией и посмотреть, будет ли это работать для меня. Не могли бы вы объяснить, что вы сделали, чтобы заставить его работать? Я вижу, что у вас есть несколько $ group и $ project, это запрос, почему? – Udi

+0

Любая идея, как я могу запустить этот необработанный запрос через Mongoid? или написать его с Монгоидом? – Udi

+1

Я думаю, что для дополнительной помощи вы должны проверить этот 'http: // stackoverflow.com/questions/25176855/data-type-conversion-in-mongodb' – Yogesh

Смежные вопросы