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: "$销售时间" }
} }
]);
问题:如何求最后销售时间对应的售价?
ringa_lee2017-05-02 09:25:33
方向性は正しいのですが、現時点では「最大販売時間に相当するドキュメント」の操作を取得するような構文はありません。代わりに、$first
/$last
のような演算子があります。 $first
がたまたま「最終販売時間」ドキュメントである場合、それを取得できますか?この目標を達成するには、まずドキュメントを並べ替えます。したがって、最後のステートメントは次のようになります: $first
/$last
这样的操作符。如果让$first
正好就是"最后销售时间"那个文档,是不是就可以取到了呢?为了达到这个目的,可以先对文档进行排序。所以最终的语句应该是这样:
db.sales.aggregate([
{$sort: {"商品": 1, "销售时间": -1}},
{$group: {_id: "$商品", "销售量": {$sum: 1}, "最后销售时间": {$first: "$销售时间"}, "最后售价": {$first: "$售价"}}}
]);
为了效率更高,$sort
可以用上索引来加速,需要以下索引:
db.sales.createIndex({"商品": 1, "销售时间": -1})
理论上,排序之后的文档可以被$group
利用而加速$group
リーリー
$sort
を高速化できます。 #🎜🎜#
リーリー
#🎜🎜#理論的には、並べ替えられたドキュメントを $group
で使用して $group
のプロセスを高速化できますが、残念ながら、これは現在のバージョンでは行われていません。それに応じて最適化します。対応する最適化のため、チケット SERVER-4507 の更新ステータスに注意してください。 #🎜🎜#