Множественное условие в группе с помощью mongodb

#mongodb #group-by #mongodb-query #aggregation-framework #conditional-operator

#mongodb #группировка по #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"}
  }}
]);    
  

Я могу сделать это отдельно, но не могу получить в одном документе как количество успешных, так и неудачных транзакций.

Ответ №1:

Поскольку вы использовали $project и спроецировали только одно поле, а другие поля больше не доступны для следующего конвейера,

Вы можете добавить другие поля в $project или вы можете использовать $addFields вместо $project ,

Игровая площадка


или вы можете попробовать выполнить все операции в $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] }
      }
    }
  }
])
  

Игровая площадка