mongodb分组查询,取各班第1名

做排行,想取每个班级(level)里积分最高的人,各取1个。
数据表如图:
图片描述

结果应该为:
图片描述

我使用的代码为:

 function onRequest(request, response, modules) {

//获取数据库对象

var db = modules.oData;

//黑坑1

db.find({

"table":"test",

"limit":2,

//"count":10,

"order":"score",

"score":{'$in':[1,2]},

"keys":"name,level,score",

// "where":{}

"count":4

},function(err,data){

// level1Dat=data;

var dataI=JSON.parse(data);

response.send(dataI);

}

);

}

得到的错误结果为:

 {

"count": 8,

"results": [

{

"createdAt": "2017-03-29 23:35:32",

"level": "2",

"name": "王王",

"objectId": "ygjV555B",

"score": "10",

"updatedAt": "2017-03-29 23:52:46"

},

{

"createdAt": "2017-03-29 23:33:38",

"level": "1",

"name": "小明",

"objectId": "nB0sLLLc",

"score": "100",

"updatedAt": "2017-03-29 23:35:52"

}

]

}

新手小白,查了一天的分组和聚合,越看越糊涂,求大神帮忙指点,谢谢

回答:

不知道你想要的形式是怎么样的,所以随便写了一下,形式上可以自己再转换。另外也没有给测试数据,以下脚本没有测试过,自己调试一下。

db.collection("test").aggregate([

// {$match: ...} 如果有条件的话

{$sort: {level: 1, score: -1},

{$group: {_id: "$level", student: "$first"}}

]).toArray(function(err, data) {

// ...

});

关于Aggregation Frameworks的话题太大了没法在这里讲。请查找相关的介绍看一下。这里用到了其中几个运算符:$sort, $group, $first

回答:

请使用MongodB的aggregation;aggregation是MongoDB的重要特性,主要实现各类分析性查询、统计、报表功能。

大概使用请参考如下:

db.odata.aggregate(

[

{

$group:

{

_id: "$level",

maxScore: { $max: "$score" }

}

}

]

)

上面是在MongoDB Shell里面的示例,MongoDB驱动都支持aggregation,您按照驱动的语法调整一下。

今后有类似需求,请首先考虑aggregation。

详细内容请参考:

https://docs.mongodb.com/manu...

供参考。

Love MongoDB! Have Fun!

回答:

Node.js 使用 mongodb,使用 mongoose 很方便。可以使用 model模块的 mapReduce, 或者 aggregation.

soonfy

以上是 mongodb分组查询,取各班第1名 的全部内容, 来源链接: utcz.com/p/196394.html

回到顶部