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中可能會出現這種情況,但由於我讀取的性能比使用聚合框架要糟糕得多,所以沒有考慮到這一點。
感謝您的答覆。它並沒有真正做到這一點,因爲我希望creditAccounts/debitAccounts/taxaccounts中的每個條目都是唯一的。在回覆中,您發佈了「debitAccount」:「1581」發生兩次,所以我想我必須向_id頂級分組添加thoose? 像: _id:{_ ID: 「$地名」,日期:{$ dateToString:{格式爲: 「%Y-%間%d」,日期: 「$創建」}},creditAccount:「$ creditAccount ',debitAccount:'$ debitAccount',taxAccount:'$ taxAccount'}, –
@FrejHåkansson如果你想要列表中的唯一項目,使用$ addToSet而不是$ push,因爲我已經更新了答案。 –
也許我有點不清楚。字段taxAccount/creditAccount/debitAccount是ID和列表:creditAccounts/debitAccounts/taxAccounts應包含每個taxAccount/creditAccount/debitAccount的taxAmount/debitAmount/creditAmount的總和。因此,在我的測試數據中,我有9個可能的creditAccount值,因此每天的creditAccounts列表不應該大於9,而應該增加總和。運行您的建議答案我每天在每個列表中獲得數百個條目。因此,回覆中的條目數量絕不會減少。 –