#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] }
}
}
}
])