使用 mongoDB 聚合查找百分比

Finding percentage using mongoDB aggregation

我收集了 2 个文档。每个文档都有 bank[ ] 数组,其中包含对象。

有 3 个银行:ABC、PQR、XYZ。

对于文档 1

banks[{name:"PQR", pdf:true, amt: 500}, {name:"ABC", amt:300}]

对于文档 2

banks[{name:"XYZ", pdf:true, amt:450}, {name:"PQR", amt:200}, {name:"ABC",pdf:true, amt:600}]

我正在尝试查找每个银行的 pdf 值为 true 的百分比。

考虑银行 ABC

总出现次数:2

出现“pdf:true”键:1

百分比:50

我想要这样的结果

{name:"ABC", percentage: 50}

同样我想找到剩余的银行。 我怎样才能通过聚合来做到这一点。请帮忙 提前致谢。

  • 我从 $unwind 开始展平 banks 数组

  • 然后用$facet进行平行分组

    创建了两个群组:

    • pdfTrue 每个银行名称的文件数量为 pdf=true
    • total 每个银行名称的文档总数。
  • 然后在连接pdfTruetotal数组并根据银行名称分组后找到百分比。

您可以使用以下方法实现您的用例:

db.collection.aggregate([
  {
    $unwind: "$banks"
  },
  {
    "$facet": {
      "pdfTrue": [
        {
          $group: {
            _id: "$banks.name",
            count: {
              $sum: {
                $cond: [
                  {
                    $eq: [
                      "$banks.pdf",
                      true
                    ]
                  },
                  1,
                  0
                ]
              }
            },
            
          }
        }
      ],
      "total": [
        {
          $group: {
            _id: "$banks.name",
            count: {
              "$sum": 1
            }
          }
        },
        {
          $project: {
            total: "$count"
          }
        }
      ]
    }
  },
  {
    $project: {
      concat: {
        $concatArrays: [
          "$total",
          "$pdfTrue"
        ]
      }
    }
  },
  {
    $unwind: "$concat"
  },
  {
    $group: {
      _id: "$concat._id",
      values: {
        $mergeObjects: {
          count: "$concat.count",
          total: "$concat.total",
          
        }
      }
    }
  },
  {
    $project: {
      "_id": 0,
      "name": "$_id",
      "percentage": {
        $multiply: [
          {
            $divide: [
              "$values.count",
              "$values.total"
            ]
          },
          100
        ]
      }
    }
  }
])

在此处查看输出:MongoDB Playground