gpt4 book ai didi

mongodb - 直接查询 MongoDB mapreduce 的结果与更新原始集合

转载 作者:可可西里 更新时间:2023-11-01 09:23:41 26 4
gpt4 key购买 nike

我有一个 mapreduce 作业,它在一组帖子上运行并计算每个帖子的受欢迎程度。 mapreduce 输出一个集合,其中包含每个帖子的 post_id 和受欢迎程度。该应用程序需要能够获得按受欢迎程度排序的帖子。有数百万条帖子,这些热门信息每 10 分钟更新一次。我能想到的两种方法:

方法一

  1. 在 posts 表流行度字段上保留一个索引
  2. 在 posts 表上运行 mapreduce(这将替换任何以前的 mapreduce 结果)
  3. 遍历 mapreduce 结果集合中的每一行,并分别更新帖子表中相应帖子的流行度
  4. 直接查询帖子表以获取按受欢迎程度排序的帖子

方法二

  1. 在 posts 表上运行 mapreduce(这将替换之前的 mapreduce 结果)
  2. 将索引添加到生成的 mapreduce 集合中的流行度字段
  3. 当应用需要posts时,首先查询mapreduce结果集合得到排序后的post_ids,然后查询posts集合得到实际的post数据

问题

  1. 方法 1 需要在帖子表中维护一个流行度索引。它还需要每 10 分钟左右单独更新数百万(帖子表有数百万行)的流行度。它只会更新那些流行度发生变化的帖子,但它仍然是对具有几个索引的集合的大量更新。这个集合也将有大量的阅读。这是可扩展的吗?
  2. 对于方法2,是否可以mapreduce posts 集合来创建一个新的人气集合,立即在其上创建索引,并查询它?
  3. 问题 #2 是否存在任何并发问题,假设应用程序将查询该流行度集合,因为它正在通过 map reduce 更新并重新编制索引。
  4. 如果 mapreduce 替换了流行度集合,我是否需要每次都手动创建一个新索引,或者 mongo 会知道在流行度字段上保留索引。基本上,索引如何与 mapreduce 结果集合一起使用。
  5. 我可以为此使用一些调整或其他方法吗??

感谢您的帮助!

最佳答案

关于 Map Reduce 的一般建议是让您的应用程序在每次插入时执行一些额外的计算,并尽可能避免执行处理器密集型 Map Reduce 作业。

是否可以向每个“帖子”文档添加一个“流行度”字段,并让您的应用程序在每次查看、点击、投票或以任何方式衡量每个帖子时增加它?然后,您可以为人气字段编制索引,按人气搜索帖子的速度将快如闪电。

如果简单地增加“流行度”字段不是一个选项,并且必须执行 MapReduce 操作,请尝试防止它对集合中的所有文档进行分页。你会发现随着你的收藏的增长,这变得非常慢。听起来您的收藏已经相当多了。

可以执行增量 map reduce,其中最新 map reduce 的结果与前一个 map reduce 的结果集成,而不是仅仅被覆盖。您还可以向 mapReduce 函数提供查询,因此不会读取所有文档。也许添加一个仅匹配自上次 map reduce 以来查看、投票或添加的帖子的查询。

关于增量 mapReduce 操作的文档在这里: http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

将新结果与旧结果相结合在“输出选项”部分进行了说明。

我意识到到目前为止我的建议非常笼统,所以我现在将尝试回答您的问题:

1) 如上所述,如果您的 MapReduce 操作必须读取每一个文档,这将无法很好地扩展。
2)MapReduce操作只输出一个集合。创建索引和查询该集合必须以编程方式完成。3) 如果有一个进程正在查询一个集合,而另一个进程正在更新它,那么查询有可能在更新之前返回一个文档。简短的回答是,“是的”4) 如果集合被删除,则必须重建索引。如果集合中的文档被删除,但集合本身没有被删除,那么索引将持续存在。在使用 {out:{replace:"output"}} 选项运行 MapReduce 的情况下,索引 (ex) 将持续存在,并且不必重新创建。
5) 如上所述,如果可能,最好将另一个字段添加到您的“posts”集合并更新它,而不是执行这么多 MapReduce 操作。

希望我能够为您提供一些在构建您的应用程序时需要考虑的额外因素。最后,重要的是要记住每个应用程序都是独一无二的,因此为了最终证明哪种方式“最好”,您将不得不试验所有不同的选项并自行决定哪种方式最有效。祝你好运!

关于mongodb - 直接查询 MongoDB mapreduce 的结果与更新原始集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com