在我们的mongodb数据库中,我们有一组用户。每个用户文档都包含有关用户的一些基本信息,例如位置,出生日期和性别。它包含一些其他属性,但这是我们存储的数据类型。
我们也会收集每位用户的月度统计数据。我们为用户收集了许多不同的统计数据,但总体思路是每个月每个用户都会有一个文档。该文档将包含许多不同的属性,主要包含数字数据。这是一份月度文件示例。
{
"UserId": ObjectId(""),
"SummaryDate": ISODate("2014-09-01T04:00:00Z"),
TotalViews: 34,
Points: 300,
Growth: 20.3
}
企业希望根据统计信息查询用户。我过去曾使用过mongodb,但不是这个用途。我的第一个想法是将其他属性合并到月度统计数据集中,但想知道其他人的想法。
一些示例报告
[ Full Name | Location | June 2014 Views | June 2014 Growth | July 2015 | July 2015 Growth ]
欣赏你的想法。
编辑:我还必须在所有领域支持某种形式的分页和排序。答案 0 :(得分:1)
要进行维度查询,您需要将这些属性保留在摘要文档中(假设它们没有太多,因为它们应该被编入索引,这会使您的写入速度有所降低)。
假设有一份文件:
{
"UserId": ObjectId(""),
"FullName":"Joe Shmoe",
"Location":"Michigan",
"SummaryDate": ISODate("2014-09-01T04:00:00Z"),
TotalViews: 34,
Points: 300,
Growth: 20.3
}
根据状态执行第二个查询将是这样的:
密歇根州的所有用户(可选择其他属性过滤器),并向我显示6月,7月和8月按7月统计数据排序的统计数据。
db.collection.aggregate( [
{"$match":{
"Location":"Michigan",
"SummaryDate":{"$gt":ISODate("2014-06-01T04:00:00Z"), "$lt":ISODate("2014-09-01T04:00:00Z")}
} },
{"$group": {
"_id":"$UserId",
"Full Name":{$first:"$FullName"},
"Location":{$first:"$Location"},
"June views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},6]},then:"$TotalViews",else:0}}},
"June growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},6]},then:"$Growth",else:0}}},
"July views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},7]},then:"$TotalViews",else:0}}},
"July growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},7]},then:"$Growth",else:0}}},
"Aug views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},8]},then:"$TotalViews",else:0}}},
"Aug growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},8]},then:"$Growth",else:0}}},
} },
{"$sort":{"July views":1} }
]);
输出将是类似此示例的文档列表:
{
"_id" : ObjectId("543445dd19b404b29e503f94"),
"Full Name" : "Jane Shmoe",
"Location" : "Michigan",
"June views" : 0,
"June growth" : 0,
"July views" : 40,
"July growth" : 20.3,
"Aug views" : 340,
"Aug growth" : 20.3
}