聚合mongodb中的指标数据

时间:2013-09-16 19:26:55

标签: 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
                    }
                },
             },
         },
     },
 }}

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

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'
        */
    }
}

任何帮助将不胜感激。

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

1 个答案:

答案 0 :(得分: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,从而提供更大的灵活性。