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"が2回発生するので、_idトップレベルのグループに追加する必要がありますか? like: {id: "$ placeName"、日付:{$ dateToString:{形式: "%Y-%m-%d"、日付: "$ created"}}、creditAccount: '$ creditAccount '、debitAccount:' $ debitAccount '、taxAccount:' $ taxAccount '}、 –
@FrejHåkanssonリストにユニークな項目が必要な場合は、回答が更新されたので$ pushの代わりに$ addToSetを使用してください。 –
おそらく私は少し不明です。 taxAccount/creditAccount/debitAccountフィールドはidsで、リスト:creditAccounts/debitAccounts/taxAccountsには、taxAccount/creditAccount/debitAccountごとにtaxAmount/debitAmount/creditAmountの合計を含める必要があります。だから私のテストデータでは、私はcreditAccountの9つの可能な値を持っているので、毎日のcreditAccountsリストは9より大きくなるべきではなく、合計が増加するべきです。あなたの提案された答えを実行する私は1日に各リストに何百ものエントリーを取得します。したがって、応答のエントリの数は決してあなたの応答で減少しません。 –