问题描述
先把案例奉上,让大家先理解我的意思:
/a/1190000004157112
上面这个链接是一个普通的sqlgroup查询,但是我现在碰到的问题是用mongo进行group查询
聚合查询实在是要了老命了,下面是模拟数据:(请原谅我的数据,他放荡不羁爱zhi由)
{ '_id' : ObjectId('590c15751f70bd329f8a972d'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'nurse', 'version' : '1.1。2。2', 'message' : '范德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:29.300Z')}{ '_id' : ObjectId('590c15751f70bd329f8a972e'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'nurse', 'version' : '1.1。2。2', 'message' : '范德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:29.447Z')}{ '_id' : ObjectId('590c157b1f70bd329f8a972f'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'bed', 'version' : '1.1。2。2', 'message' : '范1123德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:35.731Z')}{ '_id' : ObjectId('590c157c1f70bd329f8a9730'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'bed', 'version' : '1.1。2。2', 'message' : '范1123德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:36.164Z')}{ '_id' : ObjectId('590c158a1f70bd329f8a9733'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'room', 'version' : '1.1.112', 'message' : '范1123德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:50.082Z')}{ '_id' : ObjectId('590c158a1f70bd329f8a9734'), '_class' : 'com.birdnest.model.AppPublish', 'user' : 'admin', 'deviceType' : 'room', 'version' : '1.1.112', 'message' : '范1123德萨312313213213范德萨', 'creation' : ISODate('2017-05-05T06:02:50.238Z')}
需求是这样的按照deviceType分类,获得其中每个分类最新的一个版本号
我想要的结果是这样的
/* 1 */{ 'deviceType' : 'bed', 'version' :'1.1.112')}/* 2 */{ 'deviceType' : 'room', 'version' :'1.1.112')}/* 3 */{ 'deviceType' : 'nurse', 'version' : '1.1.112')}
下面这个语句是我自己写的,但是存在很多问题我写的这个事虽然做了但是想要的结果却展示不出来
db.appPublish.aggregate( {$group : {_id :'$deviceType',creation : {$max : '$creation'}}});
1._id不能映射到对象上2.version不能写在group中
实在有点弄不懂这个语法结果
/* 1 */{ '_id' : 'bed', 'creation' : ISODate('2017-05-05T06:02:44.750Z')}/* 2 */{ '_id' : 'room', 'creation' : ISODate('2017-05-05T06:02:50.397Z')}/* 3 */{ '_id' : 'nurse', 'creation' : ISODate('2017-05-05T06:02:29.447Z')}
问题解答
回答1:_id当然映射不到真正的_id上,这里的_id指的是group的key。不清楚你的version和creation是什么关系,creation比较大的文档version一定是比较新吗?如果这个条件成立的话,可以这样做:
db.question.aggregate([ {$sort: {creation: -1}}, {$group : {_id :'$deviceType', version : {$first : '$version'}}}, {$project: {deviceType: '$_id', version: '$version'}}]);
$first即group之后取第一个元素。而事先已经按creation排好序,所以第一个即是最新的元素。