Mongodb查询聚合和Groupby复杂过滤、求和、百分比查询

Posted

技术标签:

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

我有一个复杂的组查询。

数据如下:

聚合如下:

    按 doc_id 匹配 按名称分组 project: name, name_count, amount, desc as value: 由 desc 列表中金额的最大总和标识,count: (percent*100)^2 的总和,百分比:考虑该列表中金额的百分比 与 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 不需要数量(或数量已经处理好了) 这只是一个示例。否则不需要。另外,我更新了计数和百分比要求。请看那个 不懂计数。 (既不是结果也不是计算!) 【参考方案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 ....

以上是关于Mongodb查询聚合和Groupby复杂过滤、求和、百分比查询的主要内容,如果未能解决你的问题,请参考以下文章

mongodb3 之单一用途聚合

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

mongdb的聚合管道

mongoDB应用篇-mongo聚合查询

MongoDB分组查询,聚合查询,以及复杂查询

MySQL 数据库学习