使用$ unwind和sort进行MongoDB分页

时间:2019-03-27 11:02:40

标签: mongodb mongodb-query

假设我有一个很大的项目MongoDB数据库,其中每个项目都有一组嵌入式文档variants

{
  _id: 1,
  item: "item1",
  variants: [
    { type: "type1" },
    { type: "type2" }
  ]
}
{
  _id: 2,
  item: "item2",
  variants: [
    { type: "type1" },
    { type: "type3" }
  ]
}
...

我的目标是生成一个展平的分页表并能够对每一列进行排序。

按变体类型排序的分页表:

 _id ↕ | item ↕ | type ↕  
-------+--------+--------
 1     | item1  | type1
 2     | item2  | type1   
 1     | item1  | type2
 2     | item2  | type3
...

< (1),2,3,4,5 ... 54323 >

我的方法是使用MonogoDB聚合管道为每个分页获取一个子集

db.items.aggregate([
  $unwind: {
    path: '$variants.type',
    includeArrayIndex: 'variant_index'
  },
  $sort: {
    'variants.type': 1
  }, {
    $skip: 0
  }, {
    $limit: 50
  }
])

不幸的是,对于大型数据集,这是一个非常昂贵的排序操作,甚至可能导致我的具体实现出现Sort exceeded memory limit of 104857600 bytes错误。

我的问题是,是否有可能在不将变体数据移动到单独的集合中的情况下优化此算法以获得良好的性能(这是不可能的)。我曾考虑过使用“多键索引”,但我不知道如何在这里使用它们。

0 个答案:

没有答案