首页 > 解决方案 > 如何根据某些条件获取文档的最大值

问题描述

我有以下简化的 MongoDB 集合

{
    "_id":1,
    "restaurant":"Gloriuos Food",
    "cuisine":"Afghan",
    "grades":[
     {   "grade":"A",
         "score":12
     },
     {
         "grade":"B",
         "score":8
     }
    ]
}
{
    "_id":2,
    "restaurant":"Ariana",
    "cuisine":"Afghan",
    "grades":[
     {   "grade":"A",
         "score":8
     },
     {
         "grade":"B",
         "score":18
     }
    ]
}
{
    "_id":3, 
    "restaurant":"Seuda",
    "cuisine":"American",
    "grades":[
     {   "grade":"A",
         "score":4
     },
    ]
}
{
    "_id":4,
    "restaurant":"Carvel",
    "cuisine":"American",
    "grades":[
     {   "grade":"A",
         "score":8
     },
     {
         "grade":"B",
         "score":8
     }
    ]
}

我想有一个新的集合,其中关键是美食类型,值是在所有具有相同美食类型的餐厅和各自分数之间得分最高的餐厅名称。PS:分数仅基于等级数组的第一个值。

查看示例的预期结果

{"_id":"Afghan","value":["Gloriuos Food",12]}
{"_id":"American","value":["Carvel",8]}

这个结果也是有效的

{"_id":"Afghan","value":{"Gloriuos Food",12}}
{"_id":"American","value":{"Carvel",8}}

我正在尝试以下代码,但它没有产生预期的结果

var mapFunction = function(){
    emit(this.cuisine,[this.restaurant,this.grades[0].score]);
};
var reduceFunction = function(keys,values){
    var ans;
    var maxi=0;
    for(var ele in values){
        if(ele[1]>maxi){
            maxi=ele[1]
            ans=ele
        }
    }
    return ans;
};
db.restaurant.mapReduce(mapFunction,reduceFunction,{out:"cuisine"})

最后的代码产生以下结果:

{ "_id" : "Afghan", "value" : null }
{ "_id" : "American", "value" : null }

我也尝试了其他方法,但它不起作用

标签: mongodbmapreduce

解决方案


推荐阅读