我希望在事务表中使用mapper的聚合框架管道,结果应该如下所示:假设我在一个集合中有7000个status 1,2,3,4 (1=pending, 2=confirmed, 3=decline, 4=claimed)事务
数据表示:
Pending Count | Confirmed Count | Decline Count | Claimed Count
4000 2000 1000 0请看一下我的代码:
$filters = array('dateCreated'=>array(
'$gte'=>'2015-01-01',
'$lte'=>'2017-05-15'
));
$group = [
'keys' =>['userId'=>1],
'initial' => ['pendingCount'=>0, 'confirmedCount'=>0, 'declineCount'=>0, 'claimedCount'=>0],
'reduce'=>'
function(obj, result){
switch(result.status){
case 1:
result.pendingCount++;
break;
case 2:
result.confirmedCount++;
break;
case 3:
result.declineCount++;
break;
case 4:
result.claimedCount++;
break;
}
}
',
'finalize'=>'function(result){}'
];
$data = $this->mapper->find($filter, ['group'=>$group]);
echo "data<pre>";
print_r($data);输出:
在这里,您可以看到它返回我的多个文档,但我只想为所有事务创建一条记录,可能userId键应该被替换为‘null’。
数组( =>数组( _id => MongoId Object ( $id => 591a8f5bb06b243d0262d0a1 )) userId => pendingCount =>0 confirmedCount =>0 declineCount => 0 claimedCount =>0)1 =>数组( _id => MongoId对象( $id => 591a8b5bb06b243d0262d0a2)) userId userId$id en26 20 en22 en23 en25#)2数组(_id => MongoId对象( $id => 591a8f5b06b243d262d0a3) userId => 38730976 pendingCount =>0 confirmedCount => 0 declineCount => 0 claimedCount =>0)3 =>数组(en21 20#591f5b06b243d0262d0a4)en22#64920 pendingCount =>0 confirmedCount => 0 declineCount => 0 claimedCount =>0) ……
发布于 2017-05-16 05:57:49
您将按userId进行分组,这样每个userId就可以得到一行。只需传递一个空的keys数组来根据所有记录聚合数据。另外,在还原函数中有一个错误:它应该是obj.status
$group = [
'keys' =>[],
'initial' => ['pendingCount'=>0, 'confirmedCount'=>0, 'declineCount'=>0],
'reduce'=>'
function(obj, result){
switch(obj.status){
// etc.
}
}
',
'finalize'=>'function(result){}'
];https://stackoverflow.com/questions/43993255
复制相似问题