2015-04-28 51 views
4

我想計算我的分貝中的所有記錄的總和,我需要避免重複。我編寫了這段代碼來對這些記錄進行分組,但它不適用於我。按字段分組不能在MongoDB中工作

$pipeline = [ 
    ['$match' => 
      $criteria->getCondition()], 
    ['$group' => 
      ['_id' => '$order_id', 'total' => ['$sum' => '$'.$column]]] 
]; 

$this->getDbConnection()->aggregate('ticket_cache', $pipeline); 

測試要求:

db.getCollection('ticket_cache').aggregate(
{ 
"$match": 
    {"event_id":64} 
}, 
{ 
    "$group" : 
     {"_id":"$order_id", "total": {"$sum":"$payment_amount"}} 
}) 

結果:

/* 1 */ 
{ 
    "result" : [ 
     { 
      "_id" : NumberLong(7002), 
      "total" : 9000.0000000000000000 
     } 
    ], 
    "ok" : 1.0000000000000000 
} 

數據在db:

/* 1 */ 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("553f8b4fbfabe2772f8b4f51"), 
      "event_id" : NumberLong(64), 
      "ticket_id" : NumberLong(8563), 
      "ticket_code" : NumberLong(22062299), 
      "ticket_type_id" : NumberLong(391), 
      "ticket_created" : NumberLong(1430227620), 
      "ticket_deleted" : NumberLong(0), 
      "ticket_user_id" : NumberLong(2), 
      "ticket_used" : NumberLong(0), 
      "order_id" : NumberLong(7002), 
      "order_code" : NumberLong(517005), 
      "order_created" : NumberLong(1430227620), 
      "order_deleted" : NumberLong(0), 
      "order_sales_pipeline" : NumberLong(18), 
      "order_invoice_id" : NumberLong(4202), 
      "order_invoice_amount" : 3000.0000000000000000, 
      "order_invoice_created" : NumberLong(1430227641), 
      "order_invoice_deleted" : NumberLong(0), 
      "order_invoice_code" : NumberLong(420155), 
      "payment_id" : NumberLong(4365), 
      "payment_amount" : 3000.0000000000000000, 
      "payment_currency" : NumberLong(4), 
      "payment_author_id" : NumberLong(1), 
      "payment_type_id" : NumberLong(27), 
      "payment_created" : NumberLong(1430227641), 
      "payment_deleted" : NumberLong(0), 
      "create_time" : ISODate("2015-04-28T13:29:51.328Z") 
     }, 
     { 
      "_id" : ObjectId("553f8b4fbfabe2772f8b4f4f"), 
      "event_id" : NumberLong(64), 
      "ticket_id" : NumberLong(8561), 
      "ticket_code" : NumberLong(49287433), 
      "ticket_type_id" : NumberLong(391), 
      "ticket_created" : NumberLong(1430227620), 
      "ticket_deleted" : NumberLong(0), 
      "ticket_user_id" : NumberLong(2), 
      "ticket_used" : NumberLong(0), 
      "order_id" : NumberLong(7002), 
      "order_code" : NumberLong(517005), 
      "order_created" : NumberLong(1430227620), 
      "order_deleted" : NumberLong(0), 
      "order_sales_pipeline" : NumberLong(18), 
      "order_invoice_id" : NumberLong(4202), 
      "order_invoice_amount" : 3000.0000000000000000, 
      "order_invoice_created" : NumberLong(1430227641), 
      "order_invoice_deleted" : NumberLong(0), 
      "order_invoice_code" : NumberLong(420155), 
      "payment_id" : NumberLong(4365), 
      "payment_amount" : 3000.0000000000000000, 
      "payment_currency" : NumberLong(4), 
      "payment_author_id" : NumberLong(1), 
      "payment_type_id" : NumberLong(27), 
      "payment_created" : NumberLong(1430227641), 
      "payment_deleted" : NumberLong(0), 
      "create_time" : ISODate("2015-04-28T13:29:51.316Z") 
     }, 
     { 
      "_id" : ObjectId("553f8b4fbfabe2772f8b4f50"), 
      "event_id" : NumberLong(64), 
      "ticket_id" : NumberLong(8562), 
      "ticket_code" : NumberLong(24016753), 
      "ticket_type_id" : NumberLong(391), 
      "ticket_created" : NumberLong(1430227620), 
      "ticket_deleted" : NumberLong(0), 
      "ticket_user_id" : NumberLong(2), 
      "ticket_used" : NumberLong(0), 
      "order_id" : NumberLong(7002), 
      "order_code" : NumberLong(517005), 
      "order_created" : NumberLong(1430227620), 
      "order_deleted" : NumberLong(0), 
      "order_sales_pipeline" : NumberLong(18), 
      "order_invoice_id" : NumberLong(4202), 
      "order_invoice_amount" : 3000.0000000000000000, 
      "order_invoice_created" : NumberLong(1430227641), 
      "order_invoice_deleted" : NumberLong(0), 
      "order_invoice_code" : NumberLong(420155), 
      "payment_id" : NumberLong(4365), 
      "payment_amount" : 3000.0000000000000000, 
      "payment_currency" : NumberLong(4), 
      "payment_author_id" : NumberLong(1), 
      "payment_type_id" : NumberLong(27), 
      "payment_created" : NumberLong(1430227641), 
      "payment_deleted" : NumberLong(0), 
      "create_time" : ISODate("2015-04-28T13:29:51.326Z") 
     } 
    ], 
    "ok" : 1.0000000000000000 
} 

我有什麼錯?

+0

你是什麼意思「避免重複」?你期待結果如何? – JohnnyHK

+0

@JohnnyHK,就像你上面看到的那樣,我有3個記錄和'order_id'相同。我需要用「unique」'order_id'來計算所有記錄的總和。在這種情況下,我期望得到'3000',因爲正如我之前說的,我有相同的'order_id'的記錄,所以在組之後它只能找到一個記錄(這種情況),它應該計算總和。 –

+1

@Kossgreim - 你無法計算一個數字的總和(呃,你可以;它只是數字)。你要求Mongo做的是把所有具有相同'order_id'的東西放入一個組中,然後對每個組返回每個'payment_amount'在該組中的總和。 – xathien

回答

1

你可以試試下面的查詢。它假設付款金額將始終相同。看看addToSet http://docs.mongodb.org/manual/reference/operator/update/addToSet/

db.getCollection('ticket_cache').aggregate( 
{ "$match": {"event_id":64} }, 
{ "$group" : 
    {"_id":"$order_id", "total": {"$addToSet":"$payment_amount"}} 
},  
{"$unwind": "$total"}, 
{"$group": {"_id": "null", "totalOdr": {"$sum": "$total"}}} 
) 
+0

結果是: '{ 「結果」:[ { 「_id」:NumberLong(7002), 「totalOdr」:3000.0000000000000000 }, { 「_id」:NumberLong(7003), 「totalOdr 「:5000.0000000000000000 } ], 」ok「:1.0000000000000000 }' –

+0

有沒有辦法讓它變成這樣? ' { 「結果」:[ { 「_id」:NumberLong(7002), 「totalOdr」:8000.0000000000000000 }, ], 「OK」:1.0000000000000000 }'總結所有的結果到一個(在上面的情況下,返回兩個:3000和5000 –

+0

已將我的最終組更改爲空。請檢查它是否有效。 –