2
私は、コレクションのアカウントを持っています。取引には異なるフィールドを設定することができます:MongoDBの集約グループの_idは
{
"_id": ObjectId("571a0e145d29024733793d06"),
"amount": 100,
"type": "earned",
"account": ObjectId("571a0e145d29024733793cfe"),
"user": ObjectId("571a0e145d29024733793cfc"),
},
{
"_id": ObjectId("571a0e145d29024733793d04"),
"amount": 300,
"type": "spent",
"account": ObjectId("571a0e145d29024733793cfe"),
"user": ObjectId("571a0e145d29024733793cfc")
},
{
"_id": ObjectId("571a0e145d29024733793d07"),
"amount": 100,
"type": "transfer",
"sourceAccount": ObjectId("571a0e145d29024733793cfd"),
"destinationAccount": ObjectId("571a0e145d29024733793cfe"),
"user": ObjectId("571a0e145d29024733793cfc"),
}
各アカウントで統計情報のグループを作成します。 私は、データベースに集約フレームワーククエリを書いた:
db.transactions.aggregate([
{ $match: { user: user._id } },
{
$group: {
_id: '$account',
earned: {
$sum: {
$cond: [{ $eq: ['$type', 'earned'] }, '$amount', 0]
}
},
spent: {
$sum: {
$cond: [{ $eq: ['$type', 'spent'] }, '$amount', 0]
}
},
deposits: {
$sum: {
$cond: [{ $eq: ['$type', 'transfer'] }, '$amount', 0]
}
},
withdrawal: {
$sum: {
$cond: [{ $eq: ['$type', 'transfer'] }, '$amount', 0]
}
},
maxEarned: {
$max: {
$cond: [{ $eq: ['$type', 'earned'] }, '$amount', 0]
}
},
maxSpent: {
$max: {
$cond: [{ $eq: ['$type', 'spent'] }, '$amount', 0]
}
},
count: { $sum: 1 }
}
}
]);
しかし、それは正しく動作しません。フィールド勘定科目の取引の場合にのみ機能します。 フィールドアカウントまたはsourceAccountまたはdestinationAccountでグループ化したい。
私も "_id" フィールドに書き込みを試してみました:
_id: { account: '$account', sourceAccount: '$sourceAccount', destinationAccount: '$destinationAccount' }
または
_id: {$or: ['$account', '$sourceAccount', '$destinationAccount']}
または
_id: {$in: ['$account', '$sourceAccount', '$destinationAccount']}
しかし、それは間違っているグループを作るか、または動作しません。
どのようにして異なるフィールドからグループ化できますか?
はありがとうございました!それはうまく動作します!私はそのようなことをしたいと思っていましたが、私は想像することができませんでした – dimonnwc3
@ dimonnwc3あなたはこの答えを受け入れなかった特別な理由はありますか? – chridam
はい。それは正しい判断ではありませんでした。 sourcleeAccountまたはdestinationAccountのトランザクション "転送"の統計で1回カウントされます。しかし、私は両方の転送として、減算し、一方を他方に追加する必要があります。私は正しい決定を書き直し、後でそれを公表します。 – dimonnwc3