使用MongoDB在多个集合中进行基于范围的,按时间顺序的分页查询?

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

即使我只是select查询中的时间戳字段,然后为最新的30个文档做第二批查询,我不知道这是一个更好的方法。 每个分页请求将包含90个文档(全部或单个字段)。

基本上,客户可以订阅文章,每个文章的类别相差0 – 2个字段。 我刚刚select了3个,因为这是目前为止用户订阅的文章的平均数量。 由于可能的领域差异,我不认为把所有不同types的文章放在一个集合中是非常一致的。

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

选项A:获取Ids支持收集,加载完整文档,在内存中sorting

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

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

这样可以让mongo为你做分页。

选项B:3个查询,联盟,sorting,限制

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

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

如果你的查询真的是基于select的类别获得最新的文章,那么我build议你:

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

B)积极caching一切,这样你很less需要进行合并

你可以使用我在这里解释的同样的想法,虽然这篇文章是关于MongoDB文本search它适用于任何种类的查询

在汇总框架中使用文本search时,MongoDB索引优化

这个想法是查询所有的集合按date和IDsorting,然后对结果进行sorting/混合,以返回第一页。 后面的页面通过使用上一个文档的date和上一页的ID来检索。