MongoDB:我有一个借记/贷记收集,需要每个用户的余额

时间:2015-04-15 09:32:08

标签: mongodb

我有一系列交易: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

      }
    );

  }
);

我想:

  • 改善并在1个请求中取得平衡
  • 获取我的用户及其余额列表

我有关系数据库的经验,也许我想这么多,没有足够的Mongo方式。

由于

1 个答案:

答案 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" } } }
])

如果由于某种原因,用户既是单个事务的发送者又是接收者,则此聚合会产生错误的结果,但也可以对其进行修改以处理该情况。值得这样做,以确保您了解正在发生的事情。