Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Структура MongoDB БД для аггрегации больших объемов данных (https://javascript.ru/forum/server/53150-struktura-mongodb-bd-dlya-aggregacii-bolshikh-obemov-dannykh.html)

Ichigeki 22.01.2015 18:56

Структура MongoDB БД для аггрегации больших объемов данных
 
У меня есть коллекция, в которой хранится статистика кликов. На основе этих данных нужно строить отчеты. Вот пример документа
Код:

{
  "_id": {
    "dateVisited": ISODate("2014-11-05T00:00:00.0Z"),
    "campaignId": "4c29dc888be98a9488e6876133852c72",
    "landingpageId": "c5557aedab04ad1444b0ee28b5ddaab9",
    "offerId": null,
    "trafficAccountId": "84d06369b9872e9a2685483b7a532a10",
    "serverId": "32",
    "browser": "Safari",
    "platform": "Android",
    "c1": "chat",
    "c2": "au",
    "c3": "12b-ad1a",
    "c4": "mtv2",
    "city": "Perth",
    "country": "Australia",
    "deviceType": "mobile",
    "isp": "Telstra Internet",
    "netspeedId": NumberLong(3),
    "set": ""
  },
  "value": {
    "lpCount": 2,
    "offersCount": 0,
    "grandConversionCount": 0,
    "grandConversionAmount": 0
  }
}

Вот пример того, что должно получится на выходе
Код:

2014-12-24    |  50 lp clicks  |  21 offer clicks  | $600 // srv1 + srv2
  srv1        |  20 lp clicks  |  11 offer clicks  | $400 // campaign1 + campaign2
    campaign1 |  10 lp clicks  |  6 offer clicks  | $100
    campaign2 |  10 lp clicks  |  5 offer clicks  | $300
  srv2        |  30 lp clicks  |  10 offer clicks  | $200 // campaign3 + campaign4
    campaign3 |  20 lp clicks  |  4 offer clicks  | $100
    campaign4 |  10 lp clicks  |  6 offer clicks  | $100

Вот упрощенный пример запроса
db.clicks.aggregate([
  {$match: {'_id.dateVisited': new Date('2014-12-24')}},
  {$group:{
    _id: '$_id.dateVisited',
    totalLandingpageClicksCount: {$sum: '$value.landingpageClicksCount'},
    totalOfferTrackingsCount: {$sum: '$value.offerTrackingsCount'},
    totalOfferTrackingsAmount: {$sum: '$value.offerTrackingsAmount'}
  }}
])


В $match может быть включено несколько параметров (в зависимости что выберет пользователь), $group тоже может быть по нескольми параметрам, например по по dateVisited, serverId и campaignId и т.д.
Аггрегация для такой коллекции работает оочень медленно, т.к. на каждый dateVisited приходится ~10000 документов, и если пользователь захочет получить отчет за год, то $group должен обработать 365*10000=3650000 документов

Есть идеи, как спроектировать структуру БД, чтобы построение отчетов работало быстро?

MaximusFT 27.04.2016 22:56

Я бы хотел увидеть ответ ))

Не нашли решений?


Часовой пояс GMT +3, время: 21:56.