Mongodb查询聚合和Groupby复杂过滤器,总和,查询百分比

时间:2019-11-06 08:13:09

标签: mongodb mongodb-query aggregation-framework aggregate-functions

我有一个复杂的群组查询。

数据如下:

enter image description here

汇总如下:

  1. 通过doc_id进行匹配
  2. 按名称分组
  3. 项目:名称,名称计数,金额,desc为{值:由该desc列表中金额的最大总和标识,计数:(%* 100)^ 2之和,%:考虑该列表中金额的百分比}
  4. 与L1和L2相同。但是L1 L2被另一个集合引用了字段{_id,name}。因此,我需要同时投影_id,名称和我在上面第3点中所做的事情。

因此,执行后可以说结果是:

...
},
"_id" : {
        "name" : "abc"
    }, 
    "amount" : 45.0, 
    "count" : 4.0, 
    "desc" : {
            "value" : "Laptop",  // based on highest sum amount in group:'abc' i.e. 25.0 for laptop
            "count" : 5061.72, // (56*100)^2 + (44*100)^2
            "percent" :  25.0*100/45.0 = 56.0
        }, 
...

测试数据链接:MonogoDb Playground

已更新:2019年11月11日

添加了计算计数的示例

enter image description here

希望我很清楚。请帮助。

1 个答案:

答案 0 :(得分:2)

不了解计算所需的计算量。但是,您可以根据需要使用以下查询:

db.collection.aggregate([
  {
    $match: {
      "doc_id": 1
    }
  },
  {
    $group: {
      _id: {
        name: "$name",
        desc: "$desc"
      },
      amount: {
        $sum: "$amount"
      },
      count: {
        $sum: 1
      },

    }
  },
  {
    $sort: {
      "_id.name": 1,
      "amount": -1
    }
  },
  {
    $group: {
      _id: "$_id.name",
      amount: {
        $sum: "$amount"
      },
      count: {
        $sum: "$count"
      },
      desc: {
        $first: {
          value: "$_id.desc",
          descAmount: "$amount"
        }
      }
    },

  },
  {
    $addFields: {
      "desc.percent": {
        $multiply: [
          {
            $divide: [
              "$desc.descAmount",
              "$amount"
            ]
          },
          100
        ]
      }
    }
  }
])

技巧是将分组两次,并在其之间进行排序,以获得小计和第一个元素(每个名称的小计最大的元素)。 现在,您可以根据需要调整计数计算。

You can test it here