我有一个由match和bucket组成的mongodb聚合管道。匹配项仅指定要存储的文档类型,然后存储桶根据其时间戳对文档进行分类。我遇到的问题是结果全部不按(时间)顺序排列。 type
上有一个上升索引,data.tod
上有一个下降索引。
我尝试在两个阶段之间添加一个排序阶段,但似乎忽略了它。 {$sort:{'data.tod':-1}}
接下来,我在存储区{$sort:{T:-1}}
之后尝试了一种排序,这对输出也没有影响。
let cursor = self.collection.aggregate([
{
$match: {
type: 'image',
}
},{
$bucket: {
groupBy: '$data.tod',
boundaries: boundsObj.array,
default: 'ungrouped',
output: {
'data': {$addToSet:{
T: '$data.tod',
SDN: '$data.shortDirName'
}
}
}
}
}],null);
答案 0 :(得分:1)
在分组讨论之前进行排序实际上是答案,您的问题是addToSet,它不保留文档顺序。
来自官方Mongo's docs
未指定输出数组中元素的顺序。
假设我们要在存储桶阶段数据之后保留set属性。T是一个内部字段,排序运算符将在文档之间而不是文档内部进行排序。
您需要做的是展开该字段,对其进行排序,然后使用推送运算符重新分组,该运算符不会保留文档顺序。
{$unwind: '$data'},
{$sort: {'data.tod': -1}},
{$group: {_id: '$_id', 'data': {$push: '$data'}}})