我有一系列交易:sender_id,receiver_id,amount。
{
"_id": {
"$oid": "55279f6c1a7f98030043ddf3"
},
"sender_id": "00001",
"receiver_id": "00002",
"amount": 10000,
"__v": 0
}
对于给定的用户,我可以得到他是接收者的总和:他的学分
Transaction.aggregate(
{ $match : {sender_id : user.id} },
{ $group : { _id : "$sender_id", total : { $sum : "$amount" } } },
function(err, result){
....
}
);
更换"接收器"与"发件人"我得到了他的借记:
Transaction.aggregate(
{ $match : {receiver_id : user.id} },
{ $group : { _id : "$receiver_id", total : { $sum : "$amount" } } },
function(err, result){
....
}
);
所以我可以处理(信用 - 借记)并获得余额
Transaction.aggregate(
{ $match : {receiver_id : user.id} },
{ $group : { _id : "$receiver_id", total : { $sum : "$amount" } } },
function(err, received){
Transaction.aggregate(
{ $match : {sender_id : user.id} },
{ $group : { _id : "$sender_id", total : { $sum : "$amount" } } },
function(err, sent){
received[0] - sent[0] // Balance
}
);
}
);
我想:
我有关系数据库的经验,也许我想这么多,没有足够的Mongo方式。
由于
答案 0 :(得分:1)
使用以下聚合:
db.transaction.aggregate([
{ "$match" : { "$or" : [{ "sender_id" : user.id }, { "receiver_id" : user.id }] } },
{ "$project" : {
"user" : { "$cond" : [{ "$eq" : ["$sender_id", user_id] }, "$sender_id", "$receiver_id" ] },
"amount" : { "$cond" : [{ "$eq" : ["$sender_id", user_id] }, { "$multiply" : [-1, "$amount"] }, "$amount" ] }
} },
{ "$group" : { "_id" : "$user", "balance" : { "$sum" : "$amount" } } }
])
如果由于某种原因,用户既是单个事务的发送者又是接收者,则此聚合会产生错误的结果,但也可以对其进行修改以处理该情况。值得这样做,以确保您了解正在发生的事情。