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

高登

我有一个由match和bucket组成的mongodb聚合管道。匹配项仅指定要存储的文档类型,然后存储桶根据其时间戳对文档进行分类。我遇到的问题是结果全部不按(时间)顺序排列。在上有一个上升索引,在上type有一个下降索引data.tod

我尝试在两个阶段之间添加一个排序阶段,但似乎忽略了它。{$sort:{'data.tod':-1}}接下来,我在bucket之后进行了排序{$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);
汤姆·斯拉伯特

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

来自Mongo的官方文档

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章