首頁  >  問答  >  主體

mongodb - mongo 聚合查詢 分組,求最大值

  1. 先把個案奉上,讓大家先理解我的意思:

#
/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")
}
phpcn_u1582phpcn_u15822736 天前981

全部回覆(1)我來回復

  • 某草草

    某草草2017-05-17 10:04:55

    _id当然映射不到真正的_id上,这里的_id指的是group的key。
    不清楚你的versioncreation是什么关系,creation比较大的文档version一定是比較新嗎?如果這個條件成立的話,可以這樣做:

    db.question.aggregate([
        {$sort: {creation: -1}},
        {$group : {_id :"$deviceType", version : {$first : "$version"}}},
        {$project: {deviceType: "$_id", version: "$version"}}
    ]);

    $firstgroup之后取第一个元素。而事先已经按creation排好序,所以第一個就是最新的元素。

    回覆
    0
  • 取消回覆