查询方式1:
$cmd = new \MongoDB\Driver\Command([
'aggregate' => 'orders',//此处不能为test.orders
'pipeline' => [
[
'$match' => $where,
],
[
'$group' => [
'_id' => '$pay_type',
'total_amount' => ['$sum' => '$pay_amount'],
],
],
],
]);
$res = $this->orderMongo->command($cmd);
说明:
pay_type:用来分组的field
pay_amount:汇总的数据字段
orders:collectionName
$where: 条件数组,如['pay_status'=>1,'type'=>3]
对应的Mysql语句为:
select sum(pay_amount) from orders where pay_status=1 and type=3 group by pay_type
查询方式2:
$res = $this->orderMongo
->table($tableName)
->where($where)
->multiAggregate(['sum' => 'pay_amount'],['pay_type']);
附OrderMongo代码:
<?php
namespace app\erp\model\mongo;
use thinkModel;
class OrdersMongo extends Model{
protected $table = 'orders';//此处不能为test.orders
}
遇到的坑:
(1)查询方式1,match必须放在group前面,放在后面没有数据;
(2)查询方式2,这里的table不能包含数据库名,如数据库为test,要读的collection为orders,则model中的table需配置为“orders”,而不能是"test.orders",否则读取不到数据。
(3)查询方式1,aggregate对应的collectionName亦不能包含数据库名