Mongodb 增量插入与映射/减少

Mongodb 增量插入与映射/减少,mongodb,mapreduce,Mongodb,Mapreduce,假设您有一个文档集合,其结构如下: { username: "jones", likes: 20, text: "Hello world!" } 此外,假设您正在构建的应用程序需要显示每个用户喜欢的总数的统计信息。Mongodb文档显示,您可以使用以下映射/减少功能来完成此任务: function() { emit( this.username, {count: 1, likes: this.likes} ); } 然而,在我看来,每次向数据库中插入新文档时,

假设您有一个文档集合,其结构如下:

{ username: "jones",
    likes: 20,
    text: "Hello world!"
  }
此外,假设您正在构建的应用程序需要显示每个用户喜欢的总数的统计信息。Mongodb文档显示,您可以使用以下映射/减少功能来完成此任务:

function() {
    emit( this.username, {count: 1, likes: this.likes} );
  }
然而,在我看来,每次向数据库中插入新文档时,简单地增加一个“Like”计数器似乎更直观。这不需要像Map/Reduce那样遍历整个集合。它会立即更新计数器,而不是在下次Map/Reduce进程运行时更新。而且架构似乎更简单


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

我认为MongoDB文档中建议的MapReduce解决方案更通用。也就是说,如果您对每个记录的
stat(x)
函数
stat()

如果您已经知道您将始终对每个
x
stat(x)
感兴趣,那么请尽一切可能进行您认为合适的预计算和存储

不过,我可以想象,在索引和搜索统计数据的时间与每次需要时只计算统计数据之间存在着某种折衷。如果数据集变得巨大(我不确定这里是否有一个好的估计值),那么从理论上讲,每次只进行MapReduce计算可能会更有利,因为检索的等待时间也同样糟糕


不过我猜MapReduce赢得这种折衷的数据量是非常大的,即使如此,如果您想在数据后期计算中做更多的事情,它也可能不会真的更有效。

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

谢谢。这是一个非常清楚的解释。为了将巨人放到上下文中,假设我们正在讨论Stackoverflow的后端数据存储。计票是否是一个示例,您会建议使用MapReduce,即使您已经知道需要汇总选票?或者,在这种权衡变得相关之前,它必须是谷歌规模的问题。这只是一个学术问题。我的应用程序相当小,所以我会根据你的回答预先计算我的统计数据。我想,除了一些关于Hadoop的用例应该是什么的非正式帖子之外,没有更多的事情要做,那就是MapReduce要赢得检索,它需要达到数百TB。如果数据由于任何原因已经被分发并存储在不同的地方,它也可能获胜。这里有一些链接:并且没有集合大小,mapReduce在速度上与针对集合的查询类似,尤其是索引的集合。MongoDB中的MapReduce速度很慢,在javascript中,必须遍历每个文档,必须运行单线程,必须将BSON转换为JSON再转换为BSON,等等。此外,使用聚合框架(2.2版)可以比MapReduce更快地执行此查询,但预计算和直接查询总是更快。