Необходимо выполнить агрегацию для документов, где это требование, я должен отобразить значение одного поля документов в качестве ключа, а остальные поля в качестве его значения.
Я пытался использовать этапы агрегации $ group и $ map конвейера, но не смог получить желаемый результат. Тем не менее, я могу агрегировать и получить результат в виде массива.
Предоставлены документы коллекции -
[{
"_id" : ObjectId("5cf9eeb857f64ce5589546f8"),
"payment" : "poli",
"walletName" : "USDT",
"balance" : 30000.0,
"available" : 29000.0
},
{
"_id" : ObjectId("5cf9eed957f64ce5589546fa"),
"payment" : "poli",
"walletName" : "BTC",
"balance" : 15,
"available" : 13
},
{
"_id" : ObjectId("5cf9ef0f57f64ce5589546fc"),
"payment" : "nopoli",
"walletName" : "BTC",
"balance" : 15,
"available" : 12
},
{
"_id" : ObjectId("5cf9ef3957f64ce5589546ff"),
"payment" : "nopoli",
"walletName" : "USDT",
"balance" : 30000.0,
"available" : 29000.0
},
{
"_id" : ObjectId("5cf9ef4057f64ce558954700"),
"payment" : "nopoli",
"walletName" : "USD",
"balance" : 30000.0,
"available" : 29000.0
}]
Ожидаемый результат -
{
poli: { USDT : { "balance" : 30000.0,
"available" : 29000.0
},
BTC: { "balance" : 15,
"available" : 13
}
},
nopoli: { USDT : { "balance" : 30000.0,
"available" : 29000.0
},
BTC: { "balance" : 15,
"available" : 13
},
USD : { "balance" : 30000.0,
"available" : 29000.0
}
}
}
В данный момент получаю как -
[{
payment: 'poli',
wallets: [{
"name": 'USDT',
"balance" : 30000.0,
"available" : 29000.0
},
{
"name": 'BTC',
"balance" : 15,
"available" : 13
}]
},
{
payment: 'nopoli',
wallets: [{
"name": 'USD',
"balance" : 30000.0,
"available" : 29000.0
},
{
"name": 'USDT',
"balance" : 15,
"available" : 13
},
{
"name": 'BTC',
"balance" : 30000.0,
"available" : 29000.0
}]
}]
Пожалуйста, дайте мне знать, если это возможно, в соответствии с требованиями нашего клиента - для каждого метода оплаты (poli, & nopoli) мы должны попробовать доступные варианты оплаты (USDT, BTC, USD). Так что было бы так много комбинаций для проверки. И если я проецирую результат в виде массива, мне придется каждый раз проходить циклы, когда мне нужно проверить конкретную комбинацию.
Так что я думал, что обход (в таком объекте) будет простым, а также эффективным с точки зрения производительности. Пожалуйста, помогите мне выяснить, если мой подход правильный, любые предложения будут высоко оценены. Спасибо.