【问题标题】:Using Mongodb and mapreduce to create a list with sub items使用 Mongodb 和 mapreduce 创建包含子项的列表
【发布时间】:2012-03-26 15:23:32
【问题描述】:

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

我有一个这样的文件:(假设可能有成千上万个组和子组)

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

我想得到类似的结果:

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

但由于每个子组可能有更多,我想要任何重复... javascript 是否有类似 HashKey 集的东西...这里不是真正的 js 专家。

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

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

【问题讨论】:

  • 您能先解释一下为什么您的文档结构是这样的吗?为什么不将子组作为数组创建/更新您的文档,然后您根本不必进行任何 M/R 更新。
  • 它就像 Windows 中的事件查看器 ...反对它?建议在这里很受欢迎。我曾经使用 SQL ......所以 no-sql 空间是新的。也许我现在正在以转储的方式这样做。
  • 嗯..也许更新你的例子更详细?每个对象都会有一个日期戳和错误消息?并且子组不是一个明确定义的可能值列表?
  • 那是因为我没有 Group 和 SubGroup 的可能值,以及为什么我想通过 MapReduce 找到它们。我开始认为我应该将它们保存在 Mongo 的单独集合中,而不是搜索所有可能的值。可能做错了...

标签: mongodb mapreduce


【解决方案1】:

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

所以javascript 中的一切都是 一个哈希表。像这样存储你的结果,你会得到具有相同语义的哈希:

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

由于 Mapreduce 和输出类型可以是 inline、replace 和 reduce。

我的个人建议是避免使用inline。如果您要付出所有努力来运行 Map/Reduce,不妨保存结果。

剩下的是replacereducemerge(列出的选项here)。

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

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

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

相反,您可能只想对数据的新部分运行 M/R,然后针对现有的汇总数据“重新减少”。这将是最快的。

【讨论】:

  • 它现在没有记录那么多,因为是一个爱好项目,但我不妨从中学到一些东西。不过谢谢你的建议,今晚晚些时候我会研究一下。爱蒙哥...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多