2017-08-06 157 views
0

我有一个存储产品的文档,一张收据里面可以有很多产品。总计和不同计数

{"_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

在您提供的答案中是否有某些东西可以解决您的问题?如果是这样,请评论答案以澄清究竟需要解决的问题。如果它确实回答了你问的问题,那么请注意[接受你的答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)给你的问题问 –

回答

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这样的成绩回报了两个键的“独特”的结合。这允许在该组合上累积"amount",并且意味着实际上仅返回每个"id_station"的“不同”值"receipt_id"

“第二个”$group仅将关键值减少到仅“明显”的值"id_station"。请注意标记为'$_id.id_station',因为该值被放置在前一个$group阶段中的_id的“复合键”中。这就是“管道”的工作方式,只需要有可用的“输入”即前一阶段的“输出”。

对于"amount"可以将该值传递到$sum一遍,那里有“的"id_station""receiptid"多种组合,然后这是现在下降到总的只是"id_station"关键。那么,你是‘合计的总数’从

由新的降低分组键先前的输出级。

至于“的收据号”,因为第一$group制备的那些值“不同的”每个"id_station"内,则数仅仅是[ '$sum' => 1 ]结果。

基本上包含在内在两个密钥在文档中共享的问题中的数据,由于只有一个“不同”值,所以它将返回“总金额”和“收据”的计数1

+0

太棒了,它解决了这个问题。谢谢 – sontd