mongodb - 通过销售记录,按商品分组,如何计算销售量和最近一次销售的价格?

浏览:75日期:2023-06-20

问题描述

db.sales.insert({'商品':'上衣','销售时间':'2015-12-01 11:00','售价':1.3});db.sales.insert({'商品':'上衣','销售时间':'2015-12-01 12:00','售价':1.4});db.sales.insert({'商品':'裤子','销售时间':'2015-12-01 11:30','售价':2.3});db.sales.insert({'商品':'裤子','销售时间':'2015-12-01 12:30','售价':2.4});db.sales.insert({'商品':'鞋子','销售时间':'2015-12-01 11:00','售价':3.3});db.sales.insert({'商品':'鞋子','销售时间':'2015-12-01 12:00','售价':3.4});db.sales.insert({'商品':'鞋子','销售时间':'2015-12-01 12:30','售价':3.5});

db.sales.aggregate([ { $group: {_id: '$商品','销售量':{$sum:1} , '最后销售时间': { $max: '$销售时间' } } }]);

问题:如何求最后销售时间对应的售价?

mongodb - 通过销售记录,按商品分组,如何计算销售量和最近一次销售的价格?

问题解答

回答1:

Hope this helps.

mongodb - 通过销售记录,按商品分组,如何计算销售量和最近一次销售的价格?

Love MongoDB! Have Fun!

回答2:

方向是对的,但是目前没有这样的语法去取“最大的销售时间所对应的那个文档”这样的操作。变通一下,我们有$first/$last这样的操作符。如果让$first正好就是'最后销售时间'那个文档,是不是就可以取到了呢?为了达到这个目的,可以先对文档进行排序。所以最终的语句应该是这样:

db.sales.aggregate([ {$sort: {'商品': 1, '销售时间': -1}}, {$group: {_id: '$商品', '销售量': {$sum: 1}, '最后销售时间': {$first: '$销售时间'}, '最后售价': {$first: '$售价'}}}]);

为了效率更高,$sort可以用上索引来加速,需要以下索引:

db.sales.createIndex({'商品': 1, '销售时间': -1})

理论上,排序之后的文档可以被$group利用而加速$group的进程,遗憾的是目前的版本中还没有针对这点做相应的优化。相应的优化请关注Ticket SERVER-4507的更新状态。

相关文章: