将文档的映射值作为键-猫鼬聚合

时间:2019-06-07 10:21:28

标签: node.js json mongodb mongoose aggregation

需要对需要的文档进行汇总,我必须将文档的一个字段的值映射为键,并将其余字段的值映射为键。

我尝试使用$ 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)。因此,将有太多组合需要验证。而且,如果我将结果投影为数组,那么每次需要验证特定组合时,我都必须遍历。

所以我认为遍历(在这样的对象中)既容易又高效。请帮助我弄清楚我的方法是否正确,任何建议将不胜感激。谢谢。

0 个答案:

没有答案