5

有没有一种有效的方法来跨多个集合进行基于范围的查询,按时间戳上的索引排序?我基本上需要从 3 个集合中提取最新的 30 个文档,显而易见的方法是查询每个集合以获取最新的 30 个文档,然后过滤并合并结果。然而,这有点低效。

即使我只选择查询中的时间戳字段,然后对最新的 30 个文档进行第二批查询,我也不确定这是一个更好的方法。每个分页请求将是 90 个文档(整个或单个字段)。

本质上,客户端可以订阅文章,并且每个文章类别相差 0 - 2 个字段。我只选择了 3 篇,因为这是迄今为止用户在 Beta 版中订阅的平均文章数。由于可能存在的领域差异,我认为将所有不同类型的文章放在一个集合中会不会很一致。

4

3 回答 3

2

MongoDB 操作一次只对一个集合进行操作。因此,您需要使用符合查询需求的集合来构建架构。

选项 A:从支持集合中获取 Id,加载完整文档,在内存中排序

因此,您需要有一个集合,将 3 个集合的 id、主集合名称和时间戳组合到一个集合中,并查询该集合以获取 30 个 ID/集合对,然后加载相应的完整文档以及 3 个附加查询(每个主集合 1 个),当然要记住那些不会以正确的组合顺序返回,因此您需要在内存中手动对结果页面进行排序,然后再将其返回给您的客户。

{
  _id: ObjectId,
  updated: Date,
  type: String
}

这种方式允许 mongo 为您进行分页。

选项 B:3 个查询、联合、排序、限制

或者如您所说,从每个集合中加载 30 个文档,对内存中的联合集进行排序,删除额外的 60 个,然后返回组合结果。这避免了额外的收集开销和同步维护。

所以我认为你目前的方法(我称之为选项 B)是这两个不太好的选项中较小的一个。

于 2013-08-27T22:36:58.430 回答
2

如果您的查询确实是根据选择的类别获取最新文章,那么我建议您:

A) 将所有文档存储在单个集合中,以便它们可以利用单个查询来获取组合分页结果。除非您在集合之间有一个非常一致的日期范围,否则您需要跟踪日期范围和计数,以便您可以合理地获取一组可以合并的文档。一个集合中的 30 可能比另一个集合中的所有都旧。您可以为时间戳和类别添加索引,然后限制结果。

B)积极缓存所有内容,以便您很少需要进行合并

于 2013-08-28T10:58:41.460 回答
0

您可以使用我在此处解释的相同想法,尽管这篇文章与 MongoDB 文本搜索相关,但它适用于任何类型的查询

在聚合框架中使用文本搜索时的 MongoDB 索引优化

这个想法是查询所有集合,按日期和 ID 排序,然后对结果进行排序/混合以返回第一页。使用上一页的最后一个文档的日期和 id 检索后续页面。

于 2015-11-17T16:57:26.627 回答