我试图从受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。有没有人对如何使用此文档架构进行日期范围搜索有任何想法?)
答案 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,从而提供更大的灵活性。