搜索

首页  >  问答  >  正文

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

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: "$销售时间" } 
   } }
]);

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

漂亮男人漂亮男人2804 天前747

全部回复(2)我来回复

  • 高洛峰

    高洛峰2017-05-02 09:25:33

    希望这有帮助。

    爱 MongoDB!玩得开心!

    回复
    0
  • ringa_lee

    ringa_lee2017-05-02 09:25:33

    方向是对的,但是目前没有这样的语法去取“最大的销售时间所对应的那个文档”这样的操作。变通一下,我们有$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的更新状态。

    回复
    0
  • 取消回复