mongodb - mongo 聚合查询 分组,求最大值
本文介绍了mongodb - mongo 聚合查询 分组,求最大值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
先把案例奉上,让大家先理解我的意思:
https://segmentfault.com/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")
}
解决方案
_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
排好序,所以第一个即是最新的元素。
这篇关于mongodb - mongo 聚合查询 分组,求最大值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文