【问题标题】:MongoDB aggregate accounting infoMongoDB汇总会计信息
【发布时间】:2018-07-26 17:45:15
【问题描述】:

我对 MongoDB 聚合完全陌生。我目前有一个收藏,其中保存了一些帐户名称:

帐户:_id:ObjectId;名称:字符串

示例:项目:ObjectId(...)“银行帐户”等

最重要的是,我有一个日记帐集合,其中存储会计日记帐分录。它们看起来如下:

期刊:_id:ObjectId,借方:(参考账户id),贷方:(参考账户id);金额

我的想法是,我保存如下会计分录: 借方:(“银行账户”的 ID),贷方:(“股本”的 ID)

现在,我正在尝试使用聚合来获取所有帐户类型的总借方、总贷方和总和(借方-贷方)。

现在,我有点这仅适用于一种特定的帐户类型:

db.journals.aggregate(
{ $project: {
    _id: 0,
    PosSentiment: {$cond: [{$eq: ['$debit',  ObjectId("5a809cf86ce518470ec92502")]}, '$amount', 0]},
    NegSentiment: {$cond: [{$eq: ['$credit',  ObjectId("5a809cf86ce518470ec92502")]}, '$amount', 0]}
}},
{ $group: {
    _id: 0,
    debit: {$sum: '$PosSentiment'},
    credit: {$sum: '$NegSentiment'}
}});

不幸的是,这只能为我在 ObjectId 中指定的一种类型的帐户提供贷记和借记,我没有总数,我必须为每个帐户运行此。 p>

是否有可能使用聚合来得到这样的结果 [{_id: ..., name (from account collection), totaldebit, totalcredit, total}]?

非常感谢!

【问题讨论】:

  • 您能否以 JSON 格式提供您的文档示例,目前很难遵循您的代码。如果您可以提供完整的文档,那么每个人都可以更轻松地创建测试集合。这听起来像是$lookup 的用例,还请说明您的 mongo 版本 :-)

标签: mongodb nosql mongodb-query aggregation-framework aggregate


【解决方案1】:

您可以使用以下聚合。

db.journals.aggregate([
  {"$lookup":{
    "from":"accounts",
    "localField":"debit",
    "foreignField":"_id",
    "as":"debit"
  }},
  {"$lookup":{
    "from":"accounts",
    "localField":"credit",
    "foreignField":"_id",
    "as":"credit"
  }},
  {"$project":{
     "data":[
       {name:"$debit","type":"debit"},
       {name:"$credit","type":"credit"}
    ],
    "amount":1
   }},
  {"$unwind":"$data"},
  {"$group":{
    "_id":{"account":{"$arrayElemAt":["$data.name",0]},"type":"$data.type"},
    "total":{"$sum":"$amount"}
  }},
  {"$group":{
    "_id":"$_id.account._id",
    "name":{"$first":"$_id.account.name"},
    "balances":{$push:{"type":"$_id.type","total":"$total"}},
    "alltotal":{"$sum":"$total"}
  }}
])

【讨论】:

  • 您有机会验证答案吗?
猜你喜欢
  • 2019-03-19
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2012-01-07
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多