2017-05-24 152 views
3

我有一個看起來像條目的集合:蒙戈DB總結

{"placeId" : "0b980482-ab4b-4685-95ab-ecc2dcba1837","placeName" : "B8 Göteborg","created" : ISODate("2017-04-09T14:53:01.005Z"),"debitAccount" : "1581","debitAmount" : 26.0,"creditAccount" : "3013","creditAmount" : 23.2142791748047,"taxAccount" : "2620","taxAmount" : 2.78572010993958}, 
{"placeId" : "0b980482-ab4b-4685-95ab-ecc2dcba1837","placeName" : "B8 Göteborg","created" : ISODate("2017-04-09T14:53:01.005Z"),"debitAccount" : "1581","debitAmount" : 26.0,"creditAccount" : "3014","creditAmount" : 53.2142791748047,"taxAccount" : "2621","taxAmount" : 5.78572010993958} 

我所要的輸出是這樣的:

{ 
    "_id" : "B8 - Göteborg", 
    "days" : [ 
     { 
      "date" : "2017-03-24", 
      "creditAccounts" : [ 
       { 
        "creditAccount" : "3013", 
        "creditAccountSum" : 23.214279174804 
       }, 
       { 
        "creditAccount" : "3014", 
        "creditAccountSum" : 53.2142791748047, 
       }, 
      ], 
      "debitAccounts" : [ 
       { 
        "debitAccount" : "1581", 
        "debitAccountSum" : 52 
       } 
      ], 
      "taxAccounts" : [ 
       { 
        "taxAccount" : "2620", 
        "taxAccountSum" : 2.78572010993958 
       }, 
       { 
        "taxAccount" : "2621", 
        "taxAccountSum" : 5.78572010993958 
       } 
      ] 
     } 
    ] 
} 

即每地名與天都的列表獨特的creditAccounts,debitAccounts,taxAccounts及其總和。我已成功地做分組的領域之一,它看起來像:

db.getCollection('accounting_records').aggregate([ 
    {$match : {...}, 
    {$group: {_id: {placeName :'$placeName',year: {$substr: ['$created',0,4]},month: {$substr: ['$created',5,2]},dayOfMonth: {$substr: ['$created',8,2]},creditAccount:'$creditAccount'}, created: {$max: '$created'},records: { $addToSet: "$$ROOT" }}}, 
    {$sort : {created : 1}}, 
    {$group: {_id: {placeName :'$_id.placeName',year: '$_id.year',month: '$_id.month',dayOfMonth: '$_id.dayOfMonth'},created: {$max: '$created'}, creditAccounts:{$push :{creditAccount: '$_id.creditAccount',sum : {$sum: '$records.creditAmount'}, creditAccountName:'$records.creditAccountName'}}}}, 
    {$sort : {created : 1}}, 
    {$group : {_id : '$_id.placeName', created: {$max: '$created'}, days : {$push: {date: {$concat: ['$_id.year','-','$_id.month','-','$_id.dayOfMonth']},creditAccounts : '$creditAccounts'}}}}, 
    {$sort : {_id : 1}}, 
]) 

但我不知道如何管理辦分組對所有3 creditAccount,taxAccount & debitAccount。也許在mapReduce中可能會出現這種情況,但由於我讀取的性能比使用聚合框架要糟糕得多,所以沒有考慮到這一點。

回答

1
You need to `$group` each credit/debit/tax-Account/Amount and calculate sum. 



db.collection.aggregate([ 
    { 
     $group: { 
      _id:{_id:"$placeName",date:{$dateToString:{format:"%Y-%m-%d" , date:"$created"}}, creditAccount:"$creditAccount" }, 
      creditAccountSum : {$sum: "$creditAmount"}, 
      remaining: {$push: {debitAccount:"$debitAccount",debitAmount:"$debitAmount",taxAccount:"$taxAccount",taxAmount:"$taxAmount"}} 
     } 
    }, 
    {$unwind: "$remaining"}, 
    { 
     $group: { 
      _id:{_id:"$_id._id",date:"$_id.date", debitAccount:"$remaining.debitAccount"}, 
      debitAccountSum : {$sum: "$remaining.debitAmount"}, 
      remaining: {$push: {creditAccount:"$_id.creditAccount",creditAccountSum:"$creditAccountSum", taxAccount:"$remaining.taxAccount",taxAmount:"$remaining.taxAmount"}} 
     } 
    }, 
    {$unwind: "$remaining"}, 
    { 
     $group: { 
      _id:{_id:"$_id._id",date:"$_id.date", taxAccount:"$remaining.taxAccount"}, 
      taxAccountSum : {$sum: "$remaining.taxAmount"}, 
      remaining: {$push :{creditAccount:"$remaining.creditAccount",creditAccountSum:"$remaining.creditAccountSum", debitAccount:"$_id.debitAccount", debitAccountSum:"$debitAccountSum"}} 
     } 
    }, 
    {$unwind: "$remaining"}, 
    { 
     $group : { 
       _id:{_id:"$_id._id",date:"$_id.date"}, 
       creditAccounts:{$addToSet:{creditAccount:"$remaining.creditAccount",creditAccountSum:"$remaining.creditAccountSum"}}, 
       debitAccounts:{$addToSet:{debitAccount:"$remaining.debitAccount",debitAccountSum:"$remaining.debitAccountSum"}}, 
       taxAccounts:{$addToSet:{taxAccount:"$_id.taxAccount",taxAccountSum:"$taxAccountSum"}}  
     } 
    }, 
    { 
     $group : { 
      _id : {_id:"$_id._id"}, 
      days : {$push: {date:"$_id.date",creditAccounts:"$creditAccounts",debitAccounts:"$debitAccounts", taxAccounts:"$taxAccounts"}} 
     } 
    }, 
    { 
     $project: { 
      _id:"$_id._id", 
      days:"$days" 
     } 
    } 
]).pretty() 

測試數據:

{"placeId" : "0b980482-ab4b-4685-95ab-ecc2dcba1837","placeName" : "B8 Göteborg","created" : ISODate("2017-04-09T14:53:01.005Z"),"debitAccount" : "1581","debitAmount" : 26.0,"creditAccount" : "3013","creditAmount" : 23.2142791748047,"taxAccount" : "2620","taxAmount" : 2.78572010993958}, 
{"placeId" : "0b980482-ab4b-4685-95ab-ecc2dcba1837","placeName" : "B8 Göteborg","created" : ISODate("2017-04-09T14:53:01.005Z"),"debitAccount" : "1581","debitAmount" : 26.0,"creditAccount" : "3014","creditAmount" : 53.2142791748047,"taxAccount" : "2621","taxAmount" : 5.78572010993958}, 
{"placeId" : "0b980482-ab4b-4685-95ab-ecc2dcba1837","placeName" : "B8 Göteborg","created" : ISODate("2017-05-09T14:53:01.005Z"),"debitAccount" : "1581","debitAmount" : 26.0,"creditAccount" : "3014","creditAmount" : 53.2142791748047,"taxAccount" : "2621","taxAmount" : 5.78572010993958} 

輸出:

{ 
    "_id" : "B8 Göteborg", 
    "days" : [ 
     { 
      "date" : "2017-04-09", 
      "creditAccounts" : [ 
       { 
        "creditAccount" : "3014", 
        "creditAccountSum" : 53.2142791748047 
       }, 
       { 
        "creditAccount" : "3013", 
        "creditAccountSum" : 23.2142791748047 
       } 
      ], 
      "debitAccounts" : [ 
       { 
        "debitAccount" : "1581", 
        "debitAccountSum" : 52 
       } 
      ], 
      "taxAccounts" : [ 
       { 
        "taxAccount" : "2621", 
        "taxAccountSum" : 5.78572010993958 
       }, 
       { 
        "taxAccount" : "2620", 
        "taxAccountSum" : 2.78572010993958 
       } 
      ] 
     }, 
     { 
      "date" : "2017-05-09", 
      "creditAccounts" : [ 
       { 
        "creditAccount" : "3014", 
        "creditAccountSum" : 108.4285583496094 
       } 
      ], 
      "debitAccounts" : [ 
       { 
        "debitAccount" : "1581", 
        "debitAccountSum" : 52 
       } 
      ], 
      "taxAccounts" : [ 
       { 
        "taxAccount" : "2621", 
        "taxAccountSum" : 12.57144021987916 
       } 
      ] 
     } 
    ] 
} 
+0

感謝您的答覆。它並沒有真正做到這一點,因爲我希望creditAccounts/debitAccounts/taxaccounts中的每個條目都是唯一的。在回覆中,您發佈了「debitAccount」:「1581」發生兩次,所以我想我必須向_id頂級分組添加thoose? 像: _id:{_ ID: 「$地名」,日期:{$ dateToString:{格式爲: 「%Y-%間%d」,日期: 「$創建」}},creditAccount:「$ creditAccount ',debitAccount:'$ debitAccount',taxAccount:'$ taxAccount'}, –

+0

@FrejHåkansson如果你想要列表中的唯一項目,使用$ addToSet而不是$ push,因爲我已經更新了答案。 –

+0

也許我有點不清楚。字段taxAccount/creditAccount/debitAccount是ID和列表:creditAccounts/debitAccounts/taxAccounts應包含每個taxAccount/creditAccount/debitAccount的taxAmount/debitAmount/creditAmount的總和。因此,在我的測試數據中,我有9個可能的creditAccount值,因此每天的creditAccounts列表不應該大於9,而應該增加總和。運行您的建議答案我每天在每個列表中獲得數百個條目。因此,回覆中的條目數量絕不會減少。 –