1

我试图从受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。有人对如何使用此文档架构进行日期范围搜索有任何想法吗?)

4

1 回答 1

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 支持的索引结合使用可能是范围搜索的不错选择。甚至聚合框架也支持数据操作,提供更大的灵活性。

于 2013-09-16T20:41:47.597 回答