我有一个存储产品的文件,一个收据里面可以有很多产品。
{"_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}
答案 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"值。