聚合mongodb中的指标数据

zer*_*llz 1 mongodb

我试图从受NYC MUG/SimpleReach架构启发的实时指标系统中提取报表数据,也许我的想法仍然停留在SQL模式中.

数据存储在这样的文档中......

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

我一直在尝试聚合管道的不同变体而没有成功.

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'
        */
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

(ps.有没有人对如何使用此文档架构进行日期范围搜索有任何想法?)

小智 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'
      ]
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

我不认为使用此模式进行日期范围搜索是一种优雅的方式,因为MongoDB操作/预测旨在应用于值,而不是文档中的键.如果我理解正确,您提到的幻灯片中最有趣的一点是在更新时缓存/预先聚合指标.这是一个好主意,但可以用另一个模式实现.例如,将日期和时间与MongoDB支持的索引一起使用可能是范围搜索的不错选择.甚至聚合框架也支持数据操作,提供更大的灵活性