2013-09-16 7 views
1

Я пытаюсь извлечь данные отчета из системы показателей реального времени, вдохновленной схемой NYC MUG/SimpleReach, и, возможно, мой ум все еще застрял в режиме SQL.агрегирование данных метрик в mongodb

Данные хранятся в документе, как так ...

{ 
"_id": ObjectId("5209683b915288435894cb8b"), 
"account_id": 922, 
"project_id": 22492, 
"stats": { 
    "2009": { 
     "04": { 
      "17": { 
       "10": { 
        "sum": { 
         "impressions": 11 
        } 
       }, 
       "11": { 
        "sum": { 
         "impressions": 603 
        } 
       }, 
      }, 
     }, 
    }, 
}} 

и я пытался различные варианты агрегации трубопровода без успеха.

db.metrics.aggregate({ 
$match: { 
    'project_id':22492 
}}, { 
$group: { 
    _id: "$project_id", 
    'impressions': { 

     //This works, but doesn't sum up the data... 
     $sum: '$stats.2009.04.17.10.sum.impressions' 

     /* none of these work. 
     $sum: ['$stats.2009.04.17.10.sum.impressions',   
       '$stats.2009.04.17.11.sum.impressions'] 

     $sum: {'$stats.2009.04.17.10.sum.impressions',   
       '$stats.2009.04.17.11.sum.impressions'} 

     $sum: '$stats.2009.04.17.10.sum.impressions',   
       '$stats.2009.04.17.11.sum.impressions' 
     */ 
    } 
} 

любая помощь будет принята с благодарностью.

(пс. Кто-нибудь есть какие-либо идеи о том, как сделать поиск диапазона дат, используя этот документ схему?)

ответ

8

$group предназначена для применения ко многим документам, но здесь у нас есть только один согласованный документ. Вместо $project можно было бы использовать, чтобы подвести итог конкретных полей, например:

db.metrics.aggregate(
{ $match: { 
    'project_id':22492 
    } 
}, 
{ $project: { 
    'impressions': { 
     $add: [ 
     '$stats.2009.04.17.10.sum.impressions', 
     '$stats.2009.04.17.11.sum.impressions' 
     ] 
    } 
    } 
}) 

Я не думаю, что это элегантный способ сделать поиск по диапазону дат с этой схемой, поскольку операции MongoDB/предсказания предназначены для применяются к значениям, а не к ключам в документе. Если я правильно понимаю, наиболее интересным моментом в слайдах, о которых вы говорили, является кеширование/предварительная агрегация показателей при обновлении. Это хорошая идея, но может быть реализована с другой схемой. Например, использование даты и времени с индексами, которые поддерживаются MongoDB, может быть хорошим выбором для поиска диапазона. Даже структура агрегации поддерживает data operations, что дает большую гибкость.

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