是否有可能以索引支持的方式在同一个数组上执行`$ unwind`和`$ sort`?

时间:2018-05-02 03:48:00

标签: mongodb aggregation-framework

我正在尝试使用聚合框架来展开数组,并将结果排序为数组中子文档的字段。有没有办法做到这一点,索引可以用于排序?

例如,假设我有一个这样的文档数据库:

{
  name: "Alan",
  attempts: [{
    assessmentName: "Test 1",
    score: 87
  }, {
    assessmentName: "Test 2",
    score: 62
  }]
}

和得分指数{'attempts.score': 1}

我想要一个聚合管道,结果是:

{ name: "Alan", attempts: {assessmentName: "Test 2", score: 62} }
{ name: "Alan", attempts: {assessmentName: "Test 1", score: 87} }
...

如果我先放置$sort阶段:

db.students.aggregate([
  {$sort: {'attempts.score': 1}},
  {$unwind: '$attempts'}
])

然后可以使用我的索引,但结果当然不是在$unwind之后实际排序。

如果我将$sort阶段放在第二位:

db.students.aggregate([
  {$unwind: '$attempts'},
  {$sort: {'attempts.score': 1}}
])

然后我会得到我想要的结果,但是对于大型集合来说这是不可行的,因为我的索引无法使用。 (Mongo中止“排序超出内存限制104857600字节,但没有选择外部排序。中止操作。通过allowDiskUse:true选择加入。”允许它使用磁盘将避免该错误但不符合我的性能要求。)

根据我迄今为止的研究,我怀疑聚合框架目前无法做到这一点。但我当然希望自己错了。

解决部分意见的更新: 当然,通过改变数据模型可以避免这种挑战,但是为了这个问题我们假设这是我们坚持的数据模型。 (在许多情况下,更改数据模型不是一个可行的解决方案,至少在短期内不会。)

另外,我问这个问题的部分原因是因为我认为这是Mongo理论上可以支持其现有数据结构的东西。例如,如果$unwind步骤接受sortBy选项,则可以使用多键索引以所需顺序进行展开。

0 个答案:

没有答案