【问题标题】:How do I sort the output of a bucket aggregation stage?如何对存储桶聚合阶段的输出进行排序?
【发布时间】:2019-09-15 08:10:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在小组赛之前排序其实就是答案,你的问题是 addToSet 不保留文档顺序。

    来自官方Mongo's docs

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

    假设我们希望在桶阶段之后保留 set 属性,我们的字段 data.T 是一个内部字段,排序运算符在文档之间而不是在它们内部进行排序。

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

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

    【讨论】:

    • $push 运算符是我所需要的。 data 本身并不是一个数组,而只是文档中大部分相关信息的一个包装器。示例:{type:'image',data:{path:'path.jpg', tod:time_in_mS_since_epoch,imgID:checksum,tags:['tag']}
    猜你喜欢
    • 2016-03-15
    • 2016-09-08
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2019-02-18
    • 2023-03-09
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多