php f3 框架使用带有 mongo 映射器的聚合框架管道
php f3 framework use aggregation framework pipeline with mongo mapper
我想在事务 table 中使用 mongo 映射器起诉聚合框架管道,结果应该是这样的:
假设我在 status 1,2,3,4 (1=pending, 2=confirmed, 3=decline, 4=claimed)
的集合中有 7000 笔交易
数据表示:
Pending Count | Confirmed Count | Decline Count | Claimed Count
4000 2000 1000 0
1。
问题是我不确定组中的键应该使用哪个字段。
- 我的代码返回所有符合条件的记录。
请看我的代码:
$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`
Array (
[0] => Array
(
[_id] => MongoId Object
(
[$id] => 591a8f5bb06b243d0262d0a1
)
[userId] =>
[pendingCount] => 0
[confirmedCount] => 0
[declineCount] => 0
[claimedCount] =>0
)
[1] => Array
(
[_id] => MongoId Object
(
[$id] => 591a8f5bb06b243d0262d0a2
)
[userId] =>
[pendingCount] => 0
[confirmedCount] => 0
[declineCount] => 0
[claimedCount] =>0
)
[2] => Array
(
[_id] => MongoId Object
(
[$id] => 591a8f5bb06b243d0262d0a3
)
[userId] => 38730976
[pendingCount] => 0
[confirmedCount] => 0
[declineCount] => 0
[claimedCount] =>0
)
[3] => Array
(
[_id] => MongoId Object
(
[$id] => 591a8f5bb06b243d0262d0a4
)
[userId] => 64920
[pendingCount] => 0
[confirmedCount] => 0
[declineCount] => 0
[claimedCount] =>0
)
....
您按 userId
分组,因此每个 userId
占一行。只需传递一个空的 keys
数组即可针对所有记录聚合数据。你的 reducing 函数也有一个错字:它应该是 obj.status
:
$group = [
'keys' =>[],
'initial' => ['pendingCount'=>0, 'confirmedCount'=>0, 'declineCount'=>0],
'reduce'=>'
function(obj, result){
switch(obj.status){
// etc.
}
}
',
'finalize'=>'function(result){}'
];
我想在事务 table 中使用 mongo 映射器起诉聚合框架管道,结果应该是这样的:
假设我在 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
1。 问题是我不确定组中的键应该使用哪个字段。
- 我的代码返回所有符合条件的记录。
请看我的代码:
$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`
Array ( [0] => Array ( [_id] => MongoId Object ( [$id] => 591a8f5bb06b243d0262d0a1 )
[userId] => [pendingCount] => 0 [confirmedCount] => 0 [declineCount] => 0 [claimedCount] =>0 ) [1] => Array ( [_id] => MongoId Object ( [$id] => 591a8f5bb06b243d0262d0a2 ) [userId] => [pendingCount] => 0 [confirmedCount] => 0 [declineCount] => 0 [claimedCount] =>0 ) [2] => Array ( [_id] => MongoId Object ( [$id] => 591a8f5bb06b243d0262d0a3 ) [userId] => 38730976 [pendingCount] => 0 [confirmedCount] => 0 [declineCount] => 0 [claimedCount] =>0 ) [3] => Array ( [_id] => MongoId Object ( [$id] => 591a8f5bb06b243d0262d0a4 ) [userId] => 64920 [pendingCount] => 0 [confirmedCount] => 0 [declineCount] => 0 [claimedCount] =>0 )
....
您按 userId
分组,因此每个 userId
占一行。只需传递一个空的 keys
数组即可针对所有记录聚合数据。你的 reducing 函数也有一个错字:它应该是 obj.status
:
$group = [
'keys' =>[],
'initial' => ['pendingCount'=>0, 'confirmedCount'=>0, 'declineCount'=>0],
'reduce'=>'
function(obj, result){
switch(obj.status){
// etc.
}
}
',
'finalize'=>'function(result){}'
];