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。 问题是我不确定组中的键应该使用哪个字段。

  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){}'
];