0

我想对 $group 和 $push 的结果进行排序和限制。

假设我有一个在线订单系统。我想得到一个列表,其中包含每年按年份和产品数量排序的 3 个最订购产品。

year    product     amount

2016    product A   100
2016    product B   200
2016    product C   300
2016    product D   1000
2016    product E   50

2015    product F   100
2015    product G   800
2015    product A   300
2015    product B   400
2015    product C   100

2014    product A   70
2014    product B   50
2014    product G   500
2014    product C   600
2014    product D   900

返回的对象应该是这样的:

[
    {
        year: 2016,
        products: [
            {
                product: 'product D',
                amount: 1000
            },
            {
                product: 'product C',
                amount: 300
            },
            {
                product: 'product B',
                amount: 200
            }
        ]
    },
    {
        year: 2015,
        products: [
            {
                product: 'product G',
                amount: 800
            },
            {
                product: 'product B',
                amount: 400
            },
            {
                product: 'product A',
                amount: 300
            }
        ]
    },
    ...
]

在猫鼬中,我可以按年份对数据进行分组:

Orders.model
    .aggregate([
        {
            $group: {
                _id: {
                    'year': '$year',
                },
                products: {
                    $push: {
                        product: '$product',
                        amount: '$amount'
                    }
                }
            }
        },

        {
            $project: {
                _id: 0,
                year: '$_id.year',
                products: '$products'
            }
        }
    ])

它会给我所有的产品名称和数量,而不是排序。

我不知道如何对分组数据进行排序和限制。我试过 $sort, $limit, $each 没有成功。

4

1 回答 1

0

在分组之前对数据进行排序。然后最后你可以$slice用来获取前三个元素:

[
        {
            $sort: {
                year:-1,
                amount:-1
            }
        },
        {
            $group: {
                _id: {
                    'year': '$year',
                },
                products: {
                    $push: {
                        product: '$product',
                        amount: '$amount'
                    }
                }
            }
        },
        {
            $project: {
                _id: 0,
                year: '$_id.year',
                product: {$slice: [ "$products", 3 ]}
            }
        }
]
于 2016-08-29T19:13:45.843 回答