【问题标题】:Get document with the minimum value for a field for each group获取每个组的字段最小值的文档
【发布时间】:2016-07-13 04:26:34
【问题描述】:

我有一个包含两个文档的集合

{
    "_id" : ObjectId("5784def78c669ee061519aaf"),
    "name" : "nithin",
    "sal" : 2000.0,
    "age" : 20.0
},
{
    "_id" : ObjectId("5784def78c669ee061519ab0"),
    "name" : "nithin",
    "sal" : 20.0,
    "age" : 2000.0
}

我想找到给定名称和对应年龄的最低sal

在这种情况下,最低 Sal 为 20 岁,相应的年龄为 2000 岁

按如下方式运行我的查询:

db.test.aggregate([{
"$group":{"_id":"$name" ,"minSalary" :{"$min":"$sal"} , "ages":{"$addToSet":{"ageval":"$age","salval":"$sal"}}}}
,{"$project": {
         "_id":0,
          "sal":"$minSalary",
         "ages":  "$ages"
      }
  },
  {
   "$unwind":"$ages"   
   }
   ,
   {
    **"$match":{ "ages.salval":**20** }**  
    }
]
)

但问题是我希望 $match 直接应用于 minSalary 而不是将过滤器值硬编码为 20 。请帮忙

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    只需按“名称”和“sal”按升序排列$sort您的文档,然后按“名称”排列$group,并使用$$ROOT系统变量返回$first文档。

    db.test.aggregate(
        [ 
            { "$sort": { "name": 1, "sal": 1 } }, 
            { "$group": { 
                "_id": "$name", 
                "matched_doc": { "$first": "$$ROOT" } 
            }} 
        ]
    )
    

    【讨论】:

      【解决方案2】:

      我发现您的问题有些不清楚,但这里有两种情况的尝试。

      1. 将年龄和姓名组合在一起,然后得到最低工资。返回同名同龄人的最低工资

      db.getCollection('sal').aggregate([ { $group : { _id : { age : "$age", name : "$name" }, minSal : { $min : "$sal" } } } ])

      1. 仅按年龄组分组,每个年龄组获得最低工资

      db.getCollection('sal').aggregate([ { $group : { _id : "$age", minSal : { $min : "$sal"} } } ])

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-01
        相关资源
        最近更新 更多