如何排序存储桶聚合阶段的输出?

时间:2019-04-25 20:15:34

标签: node.js mongodb mongodb-query aggregation-framework

我有一个由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);

1 个答案:

答案 0 :(得分:1)

在分组讨论之前进行排序实际上是答案,您的问题是addToSet,它不保留文档顺序。

来自官方Mongo's docs

  

未指定输出数组中元素的顺序。

假设我们要在存储桶阶段数据之后保留set属性。T是一个内部字段,排序运算符将在文档之间而不是文档内部进行排序。

您需要做的是展开该字段,对其进行排序,然后使用推送运算符重新分组,该运算符不会保留文档顺序。

{$unwind: '$data'}, 
{$sort: {'data.tod': -1}}, 
{$group: {_id: '$_id', 'data': {$push: '$data'}}})