MongoDB Scema Design - 查询用户信息和月度统计信息

时间:2014-10-07 15:27:49

标签: mongodb

在我们的mongodb数据库中,我们有一组用户。每个用户文档都包含有关用户的一些基本信息,例如位置,出生日期和性别。它包含一些其他属性,但这是我们存储的数据类型。

我们也会收集每位用户的月度统计数据。我们为用户收集了许多不同的统计数据,但总体思路是每个月每个用户都会有一个文档。该文档将包含许多不同的属性,主要包含数字数据。这是一份月度文件示例。

{
  "UserId": ObjectId(""),
  "SummaryDate": ISODate("2014-09-01T04:00:00Z"),
  TotalViews: 34,
  Points: 300,
  Growth: 20.3
}

企业希望根据统计信息查询用户。我过去曾使用过mongodb,但不是这个用途。我的第一个想法是将其他属性合并到月度统计数据集中,但想知道其他人的想法。

一些示例报告

  • 告诉密歇根州所有用户,他们在开始月份和月末之间的增长率(月度摘要中的统计数据)大于X.
  • 给我密歇根州的所有用户,并在6月,7月和8月的内联中向我显示他们的统计数据,我们希望能够按特定月份的统计数据进行排序。表格如下所示: [ Full Name | Location | June 2014 Views | June 2014 Growth | July 2015 | July 2015 Growth ]

欣赏你的想法。

编辑:我还必须在所有领域支持某种形式的分页和排序。

1 个答案:

答案 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
}