增量插入与地图/减少

时间:2012-10-05 17:43:30

标签: mongodb mapreduce

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

{ 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函数是更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我认为MongoDB文档中提出的MapReduce解决方案旨在更通用。也就是说,如果您对每个记录stat(x)的某些功能stat()感兴趣x,并且您不知道您将对stat感兴趣在设置数据集的时候,MapReduce提供了一种很好的 a posteriori 方法,可以在记录中聚合这样的统计数据。

如果您已经知道,您将始终对stat(x) x感兴趣,那么请务必按照您认为合适的方式执行预先计算和存储。

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

我猜测MapReduce赢得这种权衡的数据大小是非常大的,即使在那个时候如果你想用数据后期计算做更多的事情,它可能也不会更有效率。 / p>

答案 1 :(得分:1)

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