汇总总计和不同计数

时间:2017-08-06 17:43:57

标签: php mongodb aggregation-framework

我有一个存储产品的文件,一个收据里面可以有很多产品。

{"_id" : "59871e65fffe165420e0b324"
"receiptid" : "4BA/ZFY7AQ4HvfjUMTRTLg=="
"area_type" : 1
"report_type" : 3
"id_station" : 2317
"date" : "2017-08-05 00:00:00.000"
"time" : "1501979220"
"amount" : 10113958
"item" : 32
},
{"_id" : "59871e65fffe165420e0b324"
"receiptid" : "4BA/ZFY7AQ4HvfjUMTRTLg=="
"area_type" : 1
"report_type" : 3
"id_station" : 2317
"date" : "2017-08-05 00:00:00.000"
"time" : "1501979320"
"amount" : 4000000
"item" : 12
}

我想在一个查询中计算总金额和总收据:

$store = array(2317);
$cursor = $collection->aggregate([
    ['$match' => [ 'id_station' => ['$in' => $store ], 'date' => ['$gte'=> new MongoDB\BSON\UTCDateTime(strtotime("2017-08-01")*1000), '$lte'=> new MongoDB\BSON\UTCDateTime(strtotime("2017-08-01")*1000)]  ] ],              

    ['$group' => ['_id' => ["id_station" => '$id_station'], 
                 "amountclient"=> ['$sum' => '$amount']
                ]
    ],
    ['$group' => ['_id' => ["id_station" => '$id_station', "receiptid" => '$receiptid'], 
                 "receipt"=> ['$sum' => 1]
                ]
    ]
]);

但查询没有显示任何内容,我该如何更正呢? 我想要结果: {"存储" => xxxx,"金额" => xxxx,"收据数量" => XXX}

1 个答案:

答案 0 :(得分:0)

你想要"不同的计数",这意味着你实际上"复合"将你正在尝试的东西分组:

$store = array(2317);
$cursor = $collection->aggregate([
    ['$match' => [ 
      'id_station' => ['$in' => $store ],
      'date' => [
        '$gte'=> new MongoDB\BSON\UTCDateTime(strtotime("2017-08-01")*1000),
        '$lte'=> new MongoDB\BSON\UTCDateTime(strtotime("2017-08-01")*1000)
      ]
    ]],              
    ['$group' => [
      '_id' => [ 'id_station' => '$id_station', 'receiptid' => '$receiptid' ],
      'amount' => [ '$sum' => '$amount' ]
    ]],
    [ '$group' => [
      '_id' => '$_id.id_station',
      'amount' => [ '$sum' => '$amount' ],
      'numReceipt' => [ '$sum' => 1 ]
    ]]
]);

第一个$group"包括"分组"receiptid"中的_id字段,以便结果返回" distinct"两把钥匙的组合。这允许"amount"积累在该组合上,并且意味着只有"不同的"实际上每个"receipt_id"的{​​{1}}值都会返回。

"第二" $group将关键字缩减为“不同的"仅"id_station"价值。请将注释记为"id_station",因为该值已放入"复合键"上一个$group阶段的'$_id.id_station'。这就是"管道"工作,只有可用的"输入"那是"输出"前一阶段。

对于_id,您可以再次将值传递给$sum,并且在"amount""id_station"的多个组合中,现在已经减少了只有"receiptid"键的总数。所以你是"总计"从前一阶段输出新的缩减分组键。

至于"收据的数量",因为第一个$group制作了这些值" distinct"在每个"id_station"中,该数字只是"id_station"结果。

基本上,在问题中包含的两个密钥在文档中共享的数据中,它将返回"总金额"以及"收据"的[ '$sum' => 1 ]计数因为只有一个" distinct"值。