2017-08-06 191 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