使用Mongodb和mapreduce创建包含子项的列表

时间:2012-03-25 19:28:29

标签: mongodb mapreduce

在MongoDB中存储一些日志数据。现在我需要获取一个列表,列出实际存储在集合中的日志类型。

我有这样的文件:(假装每个和更多的组和子组可能有数千个)

{
  "Group": "Import",
  "SubGroup": "Update server"
},{
  "Group": "Import",
  "SubGroup": "Delete server"
}

我想最终得到类似的东西:

{
  "Group": "Import",
  "SubGroups": ["Delete server", "Update server"]
}

但是因为每个SubGroup可能会有更多,并且我想要任何重复... javascript有类似HashKey集的东西......这里不是js专家。

我将把它用于gui,这样用户就可以选择他想看的日志类型。

作为一个附带问题。 由于Mapreduce和输出类型可以内联,替换和减少。 MongoDB中是否有任何简单的方法,所以我可以告诉它每隔x分钟只更新MapReduce,因为它实际上非常静态,或者我必须在我自己的应用层中实现缓存?

1 个答案:

答案 0 :(得分:1)

  

... javascript有类似HashKey集的东西

所以javascript 中的所有内容都是哈希表。像这样存储您的结果,您将获得具有相同语义的哈希:

{
  "Group": "Import",
  "SubGroups": { "Delete server": 1, "Update server": 1 }
}
  

由于Mapreduce和输出类型可以内联,替换和减少。

我个人的建议是避免使用inline。如果你要全力投入Map / Reduce,你也可以保存结果。

为您留下replacereduce以及merge(列出here选项)。

  

它实际上是非常静态的,还是我必须在我自己的应用层中实现缓存?

Map / Reduce的输出只是一个集合。该集合具有特定格式(_idvalue),但它是一个可查询的集合,与其他集合一样。

如果要每10分钟覆盖摘要数据,则可以这样做。但是,这意味着您必须在所有数据上运行Map / Reduce。这可能代表了日志系统中的大量工作。

相反,您可能希望仅对数据的新部分运行M / R,然后针对现有摘要数据“重新减少”。这将是最快的。