在mongodb中嵌套聚合并按字段排序

时间:2019-07-19 07:40:42

标签: mongodb

我为以下数据集的嵌套聚合创建了一个mongo查询

[{
bank: 'wells fargo',
time: '21/05/2019 02:01 AM',
amount: 1000
},
{
bank: 'bank of america',
time: '16/06/2019 02:46 AM',
amount: 4840
}]

我需要为嵌套聚合创建一个mongoquery,即每次找到总和的银行

我创建了以下查询

    db.transactions.aggregate([
    {
        $group: 
            {
                _id: 
                    {
                        'bank': '$bank', 
                        'time': '$time'
                    }, 
                sum: 
                    {
                        $sum: '$amount'
                    }
            }
    },
    {
        $group: 
            {
                _id: '$_id.bank', 
                data: {'$push': '$$ROOT'}, 
                sum: {$sum: '$sum'}
            }
    } 
]).pretty()

给出的结果为

{"_id" : "wells fargo",
    "data" : [
        {
            "_id" : {
                "bank" : "wells fargo",
                "time" : "21/05/2019 02:01 AM"
            },
            "sum" : 1000
        }]}

它工作正常,但是这里的问题是我需要按时间对结果进行排序,所以我在末尾添加了像

db.transactions.aggregate([
    {
        $group: 
            {
                _id: 
                    {
                        'bank': '$bank', 
                        'time': '$time'
                    }, 
                sum: 
                    {
                        $sum: '$amount'
                    }
            }
    },
    {
        $group: 
            {
                _id: '$_id.bank', 
                data: {'$push': '$$ROOT'}, 
                sum: {$sum: '$sum'}
            }
    }, {$sort: {time:-1}} 
]).pretty()

但是这似乎不起作用。实施排序方法有什么问题?

1 个答案:

答案 0 :(得分:0)

进行分组时,您忽略了time属性,这就是为什么按时间对数据进行排序无法使用的原因,因为time属性不再存在。 要解决此问题,只需在组管道中添加time属性。

db.transactions.aggregate([
    {
        $group: 
            {
                _id: 
                    {
                        'bank': '$bank', 
                        'time': '$time'
                    }, 
                sum: 
                    {
                        $sum: '$amount'
                    }
            }
    },
    {
        $group: 
            {
                _id: '$_id.bank', 

// Adding time property.

                time: { $first: '$_id.time'},

                data: {'$push': '$$ROOT'}, 
                sum: {$sum: '$sum'}
            }
    }, {$sort: {time:-1}} 
]).pretty()