【问题标题】:Best way to implement sorting over a large number of record in Mongo? [closed]在Mongo中对大量记录进行排序的最佳方法? [关闭]
【发布时间】:2021-08-05 19:56:13
【问题描述】:

我正在这里创建一个应用程序,用户将能够发布和喜欢/不喜欢。在后端,我使用的是 Node 和 Mongoose。现在,假设我有大约 50 万个帖子(或者可能是数百万,只是为了便于理解)。那么,如何获取热门帖子?排序需要大量时间,对吧?最好的方法是什么?

让我进一步解释一下。假设用户在“A”类别下发表了一篇文章。现在,为了获取该类别中的热门帖子,我必须首先找到该类别下列出的帖子。然后我需要排序。这需要很长时间。

您对此有何建议?关于 Mongo 是否适合此用例的任何建议?

我有两件事要处理。

  • 必须在合理的时间内获取结果。
  • 数据库必须容纳大量数据。

我也研究了 Cassandra 和 Elasticsearch。对于给定的上下文,您认为这些会提供更好的解决方案吗?

【问题讨论】:

标签: node.js database mongodb elasticsearch


【解决方案1】:

老实说,这更像是一个系统设计问题。即使使用弹性搜索,您也必须根据某些元素正确标记分析器,因此它并不应该适用于所有内容,您必须以这种方式定义它。

对于数据库,MongoDB,你能做的最好的事情就是有索引来帮助排序,因为如果没有,那么系统将不得不在 WiredTiger 缓存(WiredTiger = 存储引擎)中获取这些值,然后对它们进行排序在记忆中,想象一下会导致的讽刺:D

大多数公司对此类事物保持更精细的控制,基于预期,大多数事物都是基于标签(例如 Twitter 中的标签)进行预编译的。在它运行一次之后,你就不需要再对整个东西进行排序了。

例如,我已经对字段 A 上的数据集进行了排序,是否需要再次对所有数据集进行排序以获取新请求?否:只需调整新条目。此调整将取决于您希望向用户显示的内容。

总而言之,一个有趣的问题需要解决,但很大程度上取决于用例。准确的访问模式。话虽如此,ElasticSearch 听起来像是一个不错的候选者,但是……它也有其局限性。关注准确的访问模式,就像我已经提到的那样。

按照 OP 的要求进行编辑。

那么,我如何获取热门帖子?

这并不完全取决于对您的结果进行排序,这更取决于速率更重要的主题的爆炸性。

查看这篇文章 here Gilad。

想一想,您检查标签和单词的比率,您为此保持基于比率的计数。

对于您的类别也是如此,基于算法将这部分与仅查询所有帖子隔离开来。

亚马逊不会针对其所有数据集对某个类别的产品进行即时排名,是吗?想想吧。

预先对内容进行排序并根据新增内容,保持该部分动态并合并它们。

例如对于类别 x => 我已经根据我的算法准备好前 500 名,现在对于今天进来的新数据,我使用算法来获得相对排名,然后将前 500 名与今天排名的内容合并并显示结果。

【讨论】:

  • 感谢您提供如此好的答案。您能否提供一些参考资料,我可以从中开始或至少知道从哪里开始?一些切入点的想法会更好。
  • @awesomemypro 检查编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多