1

假设您有一组文档,其结构如下:

{ username: "jones",
    likes: 20,
    text: "Hello world!"
  }

此外,假设您正在构建的应用程序需要显示每个用户的喜欢总数的统计信息。Mongodb 文档显示您可以使用以下 Map/Reduce 函数来完成此操作:

function() {
    emit( this.username, {count: 1, likes: this.likes} );
  }

但是,对我来说,每次将新文档插入数据库时​​简单地增加一个“Like”计数器似乎更直观。这不需要像 Map/Reduce 那样遍历整个集合。它会立即更新计数器,而不是在下次 Map/Reduce 进程运行时更新。而且架构看起来更简单。

有人可以在答案中解释为什么 Map/Reduce 函数是更好的解决方案吗?

4

2 回答 2

1

我认为 MongoDB 文档中提出的 MapReduce 解决方案旨在更通用。也就是说,如果您对每条记录stat(x)的某些功能感兴趣,并且在设置数据集时不知道自己会感兴趣,那么 MapReduce 提供了一种很好的后验方法来聚合这样的跨记录的统计。stat()xstat

如果您已经知道您将始终对 each 感兴趣stat(x)x那么请务必尽可能多地进行预计算和存储,因为您认为是合适的。

不过,我可以想象,在索引和搜索统计数据的时间与每次需要时计算它们之间存在一些权衡。如果数据集变得巨大(我不确定这里是否有一个好的估计),那么理论上每次只用 MapReduce 计算它可能更有利,因为检索的等待时间会很糟糕。

虽然我猜测 MapReduce 赢得该权衡的数据大小非常大,即使那样,如果您想对数据后计算做更多的事情,它可能并不是真的更有效。

于 2012-10-05T17:48:52.463 回答
1

MapReduce 不是为临时的实时查询而设计的。它很慢。它更像是一种批处理机制,因此您提出的设计在性能方面会更有效率。

于 2012-10-05T23:03:20.937 回答