【问题标题】:Mongodb Query Aggregation and Groupby complex filter , sum , percent queryMongodb查询聚合和Groupby复杂过滤、求和、百分比查询
【发布时间】:2020-03-02 16:07:18
【问题描述】:

我有一个复杂的组查询。

数据如下:

聚合如下:

  1. 按 doc_id 匹配
  2. 按名称分组
  3. project: name, name_count, amount, desc as { value: 由 desc 列表中金额的最大总和标识,count: (percent*100)^2 的总和,百分比:考虑该列表中金额的百分比}
  4. 与 L1 和 L2 相同。但是 L1 L2 是从另一个集合中引用的字段 {_id, name}。所以,我需要同时投影 _id、name 和我在上面第 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 年 7 月 11 日

增加了计算计数的例子

希望我很清楚。请帮忙。

【问题讨论】:

  • 你能提供两个集合的数据(作为json)
  • 在问题中添加:mongoplayground.net/p/C9VREVlaaey
  • 不需要数量(或数量已经处理好了)
  • 这只是一个示例。否则不需要。另外,我更新了计数和百分比要求。请看那个
  • 不懂计数。 (既不是结果也不是计算!)

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


【解决方案1】:

不了解计数所需的计算。但是,您可以使用以下查询来满足您的需要:

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.

【讨论】:

  • 我在这里知道如何使用第二个小组赛阶段。
  • @matthPen:非常感谢。它适用于将 desc 添加到第一组。但是每个字段都需要类似的结果,即 L1 ,L2 ....
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2014-07-30
  • 1970-01-01
相关资源
最近更新 更多