Соотношение стоимости документов как ключа - агрегация мангуста - PullRequest
0 голосов
/ 07 июня 2019

Необходимо выполнить агрегацию для документов, где это требование, я должен отобразить значение одного поля документов в качестве ключа, а остальные поля в качестве его значения.

Я пытался использовать этапы агрегации $ 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). Так что было бы так много комбинаций для проверки. И если я проецирую результат в виде массива, мне придется каждый раз проходить циклы, когда мне нужно проверить конкретную комбинацию.

Так что я думал, что обход (в таком объекте) будет простым, а также эффективным с точки зрения производительности. Пожалуйста, помогите мне выяснить, если мой подход правильный, любые предложения будут высоко оценены. Спасибо.

...