【问题标题】:Grouping from multiple arrays and find sum从多个数组分组并找到总和
【发布时间】:2021-08-18 08:57:58
【问题描述】:

我有这些文件。

[
    {
        _id: 'a1',
        sales: [
            {
                amont: 12,
                servicer_id: 'A',
            },
            {
                amont: 10,
                servicer_id: 'B',
            },
        ],
        service: [
            {
                amont: 25,
                servicer_id: 'A',
            },
            {
                amont: 20,
                servicer_id: 'B',
            },
        ],
    },
    {
        _id: 'a2',
        sales: [
            {
                amont: 10,
                servicer_id: 'A',
            },
            {
                amont: 20,
                servicer_id: 'B',
            },
        ],
        service: [
            {
                amont: 15,
                servicer_id: 'A',
            },
            {
                amont: 10,
                servicer_id: 'B',
            },
        ],
    },
]

从上面的文档中,我想找到以下内容。

1.服务端A和B服务的次数。

2.服务商 A 和 B 完成的销售数量。

3.服务者A和B的总服务量。

4.服务商A和B的总销售额。

预期输出

[
    {
        servicer: 'A',
        services: 2,
        sales: 2,
        totalSale: 22,
        totalService: 40,
    },
    {
        servicer: 'B',
        services: 2,
        sales: 2,
        totalSale: 30,
        totalService: 30,
    },
];  

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    这个方法很简单,我们通过服务 id 去$group,然后使用$sum 来计算所有需要的值,像这样:

    db.collection.aggregate([
      {
        $unwind: {
          path: "$service",
          preserveNullAndEmptyArrays: true
        }
      },
      {
        $group: {
          _id: {
            serviceId: "$service.servicer_id",
            docId: "$_id"
          },
          services: {
            $sum: 1
          },
          sales: {
            $first: "$sales"
          },
          totalService: {
            $sum: "$service.amont"
          },
          
        }
      },
      {
        "$addFields": {
          serviceSales: {
            $filter: {
              input: "$sales",
              as: "sale",
              cond: {
                $eq: [
                  "$$sale.servicer_id",
                  "$_id.serviceId"
                ]
              }
            }
          }
        }
      },
      {
        $group: {
          _id: "$_id.serviceId",
          services: {
            $sum: "$services"
          },
          sales: {
            $sum: {
              $size: "$serviceSales"
            }
          },
          totalService: {
            $sum: "$totalService"
          },
          totalSale: {
            $sum: {
              $reduce: {
                input: "$serviceSales",
                initialValue: 0,
                in: {
                  $sum: [
                    "$$value",
                    "$$this.amont"
                  ]
                }
              }
            }
          }
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

    • 我已经检查了上面的答案。但是当我向服务数组添加一个对象时,我得到了错误的数量。更多mongoplayground.net/p/5pNK2gA6lwL@Tom Slabbaert
    • 究竟是哪个字段的问题? $sum 运算符之一可能不是您想要的逻辑。
    • 请检查链接mongoplayground.net/p/5pNK2gA6lwL。没有。服务商 B 的销售额是错误的。实际上,服务商 A 只有 2 个销售额。当我向服务数组添加一个对象时会发生这些错误
    • 好吧,看来我误解了这个问题,这里有一个应该可以解决的问题:mongoplayground.net/p/j_JP1O52mFZ 我也会编辑我的答案。请注意,这是假设如果该服务不在同一个数组中,则无法销售该服务。
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多