【问题标题】:Select Max() with "group by" in mongodb在 mongodb 中使用“group by”选择 Max()
【发布时间】:2012-05-16 05:40:51
【问题描述】:

请帮我把这个选择语句转换成 mongodb:

Select Name, Max(Value) From table1 Group By Name

我阅读了这份文件:http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

但仍然不知道如何应用 Max() 方法而不是 SUM() 作为该文档。

谢谢。

【问题讨论】:

  • 没试过,reduce: function(obj,prev) { if (prev.c < obj.c) { prev.c = obj.c; } },

标签: mongodb


【解决方案1】:

使用聚合框架:

db.table1.aggregate({$group:{'_id':'$name', 'max':{$max:'$value'}}}, 
{$sort:{'max':1}}).result

【讨论】:

    【解决方案2】:

    我创建了 Mongo Collection 如下。

    { "_id" : ObjectId("4fb36bfd3d1c88bfa15103b1"), "name" : "bob", "value" : 5 }
    { "_id" : ObjectId("4fb36c033d1c88bfa15103b2"), "name" : "bob", "value" : 3 }
    { "_id" : ObjectId("4fb36c063d1c88bfa15103b3"), "name" : "bob", "value" : 7 }
    { "_id" : ObjectId("4fb36c0c3d1c88bfa15103b4"), "name" : "john", "value" : 2 }
    { "_id" : ObjectId("4fb36c103d1c88bfa15103b5"), "name" : "john", "value" : 4 }
    { "_id" : ObjectId("4fb36c143d1c88bfa15103b6"), "name" : "john", "value" : 8 }
    { "_id" : ObjectId("4fb36c163d1c88bfa15103b7"), "name" : "john", "value" : 6 }
    

    然后通过使用以下代码,我将其按名称和 max(value) 分组

    db.table1.group(
        {key: {name:true},
            reduce: function(obj,prev) { 
                if (prev.maxValue < obj.value) { 
                    prev.maxValue = obj.value; 
                }  
            },
        initial: { maxValue: 0 }}
    );
    

    结果显示为

    [
        {
            "name" : "bob",
            "maxValue" : 7
        },
        {
            "name" : "john",
            "maxValue" : 8
        }
    ]
    

    使用聚合框架要简单得多。通过使用聚合框架,您可以使用以下代码获得相同的结果。

    db.table1.aggregate([
        {
           $group:{_id:"$name", "maxValue": {$max:"$value"}}
        }
    ]);
    

    【讨论】:

    • 你好帕文。这种方法是否可以检查最大日期,我的意思是最新日期?
    • 抱歉回复晚了。是的,也可以用这种方法比较日期。您只需将 obj.date 替换为 obj.value
    【解决方案3】:
    var myresult = db.table1.aggregate([{ 
        $group: {
            _id:"$Name",                                                                     
            value: { $max: "$Value" } 
        } 
    }]);
    print(myresult)
    

    【讨论】:

      【解决方案4】:

      由于 MongoDB 支持 mapreduce,下面的功能应该可以做到。

      db.employee.insert({name:"Tejas",Value:2})
      db.employee.insert({name:"Tejas",Value:3})
      db.employee.insert({name:"Varma",Value:1})
      db.employee.insert({name:"Varma",Value:6})
      
      var map=function(){
      var key={name:this.name};
      var value={value:this.Value};
      emit(key,value);
      };
      
      var reduce=function(key,values){
      var max=-1;
      values.forEach(function(value){
                  if(max==-1){
              max=value['value'];
          }
          if(max<value['value']){
              max=value['value'];
          }
      });
      return {max:max};
      };
      

      db.employee.mapReduce(map,reduce,{out:{inline:1}});

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 2021-08-02
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        相关资源
        最近更新 更多