2014-11-13 27 views
0

我正在关注预汇总报告的官方MongoDB文档(http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/)。按照教程,预聚合的文件应该是这样的:MongoDB预先汇总报告的模式设计

{ 
    _id: "20101010/site-1/apache_pb.gif", 
    metadata: { 
    date: ISODate("2000-10-10T00:00:00Z"), 
    site: "site-1", 
    page: "/apache_pb.gif" }, 
    hourly: { 
    "0": 227850, 
    "1": 210231, 
    ... 
    "23": 20457 }, 
    minute: { 
    "0": { 
     "0": 3612, 
     "1": 3241, 
     ... 
     "59": 2130 }, 
    "1": { 
     "0": ..., 
    }, 
    ... 
    "23": { 
     "59": 2819 } 
    } 
} 

的事情是,我目前使用这种方法,我已经存储了这样一些数据。但是现在我想在元数据子文档中添加另一个维度,我正在重新考虑整个事情。

我的问题是:是否有理由建立存储在元数据属性中的相同信息的_id属性?仅仅创建一个围绕元数据的复合索引(唯一的)并且对_id键使用ObjectId是不够的?

谢谢!

+1

是的,这将是罚款。在这里使用'_id'看起来只是为了方便,因为它完全匹配一个URI段。 – wdberkeley

回答

0

其他方式;)

您可以创建简单的集合:

{ 
    "ts": "unix timestamp", 
    "site": "site-1", 
    "page": "/apache_pb.gif" 
} 

此集合会被任何可以对插入

,并使用复杂的聚合查询(用骨料非常出色的表现时间谷物):

db.test.aggregate(
[ 
    { 
    "$project": { 
     "ts": 1, 
     "_id": 0, 
     "grain": { 
     "$subtract": [ 
      { 
      "$divide": [ 
       "$ts", 
       3600 
      ] 
      }, 
      { 
      "$mod": [ 
       { 
       "$divide": [ 
        "$ts", 
        3600 
       ] 
       }, 
       1 
      ] 
      } 
     ] 
     }, 
     "site": 1, 
     "page": 1 
    } 
    }, 
    { 
    "$group": { 
     "_id": { 
     "site": "$site", 
     "page": "$page", 
     "grain": "$grain", 
     } 
    } 
    }, 
    { 
    "$group": { 
     "tsum": { 
     "$sum": 1 
     }, 
     "_id": { 
     "grain": "$_id.grain" 
     } 
    } 
    }, 
    { 
    "$project": { 
     "tsum": "$tsum", 
     "_id": 0, 
     "grain": "$_id.grain" 
    } 
    }, 
    { 
    "$sort": { 
     "grain": 1 
    } 
    } 
]) 

通过o NE小时 - 3600秒,在这个例子中

恕我直言 - 这是不具有良好的性能与复杂的数据模型更加简单管理的解决方案(不要忘记指数)

+0

嗯,将维放在元数据子文档中的好处是可以在元数据上添加唯一索引,然后我可以在不修改索引的情况下添加任意维。 – iuri

+0

您还可以使用ISODate对象和日期聚合运算符http://docs.mongodb.org/manual/reference/operator/aggregation-date/按不同时间段汇总统计信息。我不知道哪种方法会更高效。 – iuri

+0

在这篇文章中,我尝试解释如何使用$ project语句计算字段,以不同时间段聚合数据;) –