group by mongodb 中的多个条件

Multiple condition in group by mongodb

我在数据库中有这样的数据:

{
  "_id" : ObjectId("5ec4e40a7c89c96c7c3818f0"),
  "lob" : "DIGITAL_STORE",
  "paymentMode" : "NET_BANKING",
  "pgStatus" : "PG_SUCCESS",
  "createdAt" : ISODate("2020-05-20T08:02:18.566Z"),
  "updatedAt" : ISODate("2020-07-22T18:57:29.915Z"),
  "updatedBy" : "ONLINE_CHANNEL",
  "_class" : "com.airtel.payments.pg.commons.persistence.PgTransactionDetails"
},
{
  "_id" : ObjectId("5ec4e40a7c89c96c7c3818f0"),
  "lob" : "DIGITAL_STORE",
  "paymentMode" : "NET_BANKING",
  "pgStatus" : "PG_FAILED",
  "createdAt" : ISODate("2020-05-20T08:02:18.566Z"),
  "updatedAt" : ISODate("2020-07-22T18:57:29.915Z"),
  "updatedBy" : "ONLINE_CHANNEL",
  "_class" : "com.airtel.payments.pg.commons.persistence.PgTransactionDetails"
}

我需要从 mongodb 获取数据,我可以在其中获取按 LOB 和付款模式分组的一个文档中的成功和失败计数。

我试过类似的方法,但是 lob 和支付模式分离没有出现。

db.getCollection('transactionDetails').aggregate([
  {$project: {
    Success: {$cond: [{$eq: ["$pgStatus", "PG_SUCCESS" ]}, 1, 0]},
    Failed: {$cond: [{$eq: ["$pgStatus", "PG_FAILED"]}, 1, 0]}
  }},
  {$group: {
    _id: {Lob:"$lob",Mode:"$paymentMode"},
    Success: {$sum: "$Success"},
    Failed: {$sum: "$Failed"}
  }}
]);    

我可以单独执行此操作,但无法在单个文档中同时获得成功和失败交易的计数。

因为您使用了 $project 并且您只投影了一个字段,而其他字段不再可用于下一个管道,

您可以在 $project 中添加其他字段,或者您可以使用 $addFields 代替 $project

Playground


或者您可以尝试在 $group

中的所有操作
db.getCollection('transactionDetails').aggregate([
  {
    $group: {
      _id: { Lob: "$lob", Mode: "$paymentMode" },
      Success: {
        $sum: { $cond: [{ $eq: ["$pgStatus", "PG_SUCCESS"] }, 1, 0] }
      },
      Failed: {
        $sum: { $cond: [{ $eq: ["$pgStatus", "PG_FAILED"] }, 1, 0] }
      }
    }
  }
])

Playground