我正在尝试使用聚合框架来展开数组,并将结果排序为数组中子文档的字段。有没有办法做到这一点,索引可以用于排序?
例如,假设我有一个这样的文档数据库:
{
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
选项,则可以使用多键索引以所需顺序进行展开。