大家好,自从上次咨询过mongodb在项目应用的优点后使用mongodb有一段时间了,在一些简单的查询和统计上也算了解应如何使用。
但是这里碰到一个问题,就是例如我有这样一个文档:
[
'order_id' => '2',
'order_data' => [
[
'product_id' => '1',
'product_price' => '2',
],
[
'product_id' => '2',
'product_price' => '4',
],
[
'product_id' => '3',
'product_price' => '6',
],
[
'product_id' => '4',
'product_price' => '8',
],
[
'product_id' => '5',
'product_price' => '10',
],
],
]
我需要对该订单里边价格大于5的商品进行统计并计算出总价,当然我可以先把文档提取出来再循环计算,但是我想利用mongodb的aggregate或者其它方法进行计算,但是不太能找到合适的方法,请问大神们这个情况mongodb的查询方法应该怎么写呢?
1.统计一般是后台脚本,计算完成后,放到存储表中
2.除了aggregate,如果不是即时计算,可以使用mongodb的mapreduce
3.这些统计函数,都有一个map函数,在map的时候,做数据的处理
4.订单本身就没有多少数据,一天几千条数据就很多了,统计数据一般都不是即时查询,都是计算完成后放到表里,然后去统计完成后的表中查询数据,因此也无所谓效率(前提是数据量不大)。
1、上面的问题可以这样解决:
[
'$unwind' => 'order_data'
],
[
'$match' => [
'order_data.product_price' => [
'$gt' => 5
]
]
],
[
'$group' => [
'_id' => 'order_id',
'total' => [
'$sum' => '$order_data.product_price'
]
]
]
2、问这个问题的时候其实还没怎么了解过aggregate,捣鼓了一段时间后觉得aggregate非常灵活
3、aggregate自带大量的表达式,可以写出很复杂的运算方法,这种运算统计如果用php后台脚本来写个人感觉非常丑陋和难以维护;
4、在即时查询上aggregate的处理速度比想象中快,不过这可能是项目的数据不太多的原因;现在的项目就是把订单保存成跟fecshop比较类似的结构,在各种查询上用aggregate来处理。
5、用aggregate实在开阔了眼界,个人感觉这比excel的统计功能还厉害