【问题标题】:Mongodb Group by get $max and count of max in value and percent of that groupMongodb Group by get $max 和 max 的值和该组的百分比
【发布时间】:2019-10-21 03:32:15
【问题描述】:

我需要对 x 字段进行分组并获取其他字段的最大值。是的,使用$max 我们可以获得最大重复值。但是,我还需要得到 count $max 的百分比/计数值。换句话说,这个$max 值在该组中存在多少次。请帮忙。

示例:

db.getCollection("test").aggregate(
    [
        { "$match" : { "doc_id" : 1.0 } }, 
        { "$group" : {
                "_id" : { "name" : "$name" }, 
                "total" : { "$sum" : "$amount" }, 
                "l1_max" : { "$max" : "$l1" }
            }
        }, 
    ]
);

在这里,我收到 l1_max = 'Computer' 。但是,我需要它为'Computer - (30%) Total 4/12'

更新:2019 年 10 月 20 日 @mickl:感谢您的回答。

字段 l1 实际上是一个引用字段。在普通的 find/project 或 mongoose populate() 中,它有助于从其他集合中获取字段。例子: 如果 l1 是 ObjectId 类型,那么,

l1: {
_id, "4343434343sdsdsY",
name: "IT"
}

所以 l1.name 将从 project/populate 函数中的另一个集合中获取 name 字段。

我执行了以下代码:

db.getCollection("test").aggregate(
    [
        { "$match" : { "doc_id" : 1.0 } }, 
        { "$group" : {
                "_id" : { "name" : "$name" }, 
                "total" : { "$sum" : "$amount" }, 
                "count": { '$sum': 1 },
                "l1_max" : { "$max" : "$l1" },
                "l1_values": { $push: "$l1" }
            }
        },
        {
            $project: {
                _id: 1,
                total: 1,
                l1 : {"_id": "$l1_max", "count": "$count", "percent": { $divide: [ { $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },"$count"]}}
            }
        }
    ]
);

答案如下:但我也需要引用 name 字段。

{ 
    "_id" : {
        "name" : "xzy"
    }, 
    "total" : 35.0, 
    "l1" : {
        "_id" : "4343920239201W", 
        "name" : "IT",                // **MISSING**
        "count" : 4.0, 
        "percent" : 0.25
    }
}

希望我这次清楚了。

【问题讨论】:

  • 能否添加样本集合 json 和预期输出

标签: mongodb aggregation-framework


【解决方案1】:

您需要捕获组中的所有l1 值,并使用$divide$filter$size 计算百分比:

db.getCollection("test").aggregate(
    [
        { "$match" : { "doc_id" : 1.0 } }, 
        { "$group" : {
                "_id" : { "name" : "$name" }, 
                "total" : { "$sum" : "$amount" }, 
                "l1_max" : { "$max" : "$l1" },
                "l1_values": { $push: "$l1" }
            }
        },
        {
            $project: {
                _id: 1,
                total: 1,
                l1_max: 1,
                l1_perc: { 
                    $divide: [
                        { $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },
                        { $size: "$l1_values" }
                    ]
                }
            }
        }
    ]
);

Mongo Playground

【讨论】:

  • 非常感谢。有效。再补充一点,字段 l1 是一个参考字段。如何读取另一个集合“名称”字段,即最后我需要获取 l1._id 和 l1.name。目前,我正在尝试,这个 concat 但它说 l1 被引用,不能连接。
  • @Vikash 你所描述的有点不清楚。您能否提出另一个问题并通过一些示例描述您的新要求?谢谢!
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 2010-11-20
  • 2012-10-30
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多