Mongodb查询聚合和Groupby复杂筛选器、总和、百分比查询

Mongodb查询聚合和Groupby复杂筛选器、总和、百分比查询,mongodb,mongodb-query,aggregation-framework,aggregate-functions,Mongodb,Mongodb Query,Aggregation Framework,Aggregate Functions,我有一个复杂的组查询 数据如下: 聚合如下: 按文档id匹配 按名称分组 项目:名称,名称\计数,金额,描述为{值:由该描述列表中的最大金额总和标识,计数:总和(百分比*100)^2,百分比:考虑该列表中金额的百分比} 与L1和L2相同。但是L1和L2是从另一个集合引用的字段{u id,name}。因此,我需要在上面的第3点中同时投射_id、name和我所做的事情 因此,执行后,让我们假设结果为: ... }, "_id" : { "name" : "abc" },

我有一个复杂的组查询

数据如下:

聚合如下:

  • 按文档id匹配
  • 按名称分组
  • 项目:名称,名称\计数,金额,描述为{值:由该描述列表中的最大金额总和标识,计数:总和(百分比*100)^2,百分比:考虑该列表中金额的百分比}
  • 与L1和L2相同。但是L1和L2是从另一个集合引用的字段{u id,name}。因此,我需要在上面的第3点中同时投射_id、name和我所做的事情 因此,执行后,让我们假设结果为:

    ...
    },
    "_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
            }, 
    ...
    
    测试数据链路:

    Udpated:2019年11月7日

    增加了计算计数的示例


    希望我是清楚的。请帮忙

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

    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
            ]
          }
        }
      }
    ])
    
    技巧是分组两次(排序介于两者之间),以获得小计和第一个元素(每个名称的小计最大的元素)。 现在,您可以根据需要调整您的计数计算


    .

    我不明白你需要计算多少。但是,您可以使用以下查询来满足您的需要:

    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
            ]
          }
        }
      }
    ])
    
    技巧是分组两次(排序介于两者之间),以获得小计和第一个元素(每个名称的小计最大的元素)。 现在,您可以根据需要调整您的计数计算


    .

    您能否提供问题中添加的两个集合(作为json)的数据:不需要数量(或数量已经解决了),这只是一个示例。否则就不需要了。此外,我还更新了计数和百分比要求。请看一看那个不明白的数字。(既不是结果也不是计算!)您可以提供问题中添加的两个集合(作为json)的数据:不需要数量(或数量已经考虑了),这只是一个示例。否则就不需要了。此外,我还更新了计数和百分比要求。请看一看那个不明白的数字。(既不是结果也不是计算!)我知道如何使用第二组阶段。@matthPen:非常感谢。将desc添加到第一个组时,它起作用。但每个领域都需要类似的结果,如L1、L2……我知道如何使用第二组阶段。@matthPen:非常感谢。将desc添加到第一个组时,它起作用。但每个字段都需要类似的结果,即L1、L2。。。。