2015-02-12 71 views
0

我有以下收集 -如何使用mongoDB從集合中找到不同的(和最大的)值?

[{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.20", 
    "runtimeMilliSeconds" : 1422007201815 
} 
{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.20", 
    "runtimeMilliSeconds" : 1422008101736 
} 
{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.21", 
    "runtimeMilliSeconds" : 1422009002239 
} 
{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.21", 
    "runtimeMilliSeconds" : 1422009901379 
} 
{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.22", 
    "runtimeMilliSeconds" : 1422010801685 
} 
{ 
    "customerId" : "54a32e9f1e14fa5476d654db", 
    "hostId" : "192.168.20.22", 
    "runtimeMilliSeconds" : 1422010801585 
}] 

我也有主機標識的名單爲: 「192.168.20.20」, 「192.168.20.21」, 「192.168.20.22」]

我想匹配HOSTID清單,收集和發現最新的(最大)runtimeMilliSeconds只得到輸出如下 -

[{"hostId":"192.168.20.20", "runtime": 1422007201815}, 
{"hostId":"192.168.20.21", "runtime": 1422009002239}, 
{"hostId":"192.168.20.22", "runtime": 1422010801685}] 

我已經嘗試了與蒙戈聚集以下 -

{ "$match" : { "hostId" : { "$in" : [ "192.168.20.20" , "192.168.20.21" , "192.168.20.22"]} , 
"customerId" : "54a32e9f1e14fa5476d654db"}}, 
{ "$sort" : { "runtimeMilliSeconds" : -1}}, 
{ "$group" : { "_id" : { "hostId" : "$hostId" , 
"runtime" : "$runtimeMilliSeconds"}}}, 
{ "$project" : { "hostId" : "$_id.hostId" , 
"runtimeMilliSeconds" : "$_id.runtime" , "_id" : 0}} 

但它給我集合中的所有價值。

如何使用mongo獲得上述輸出?

回答

0

您好我認爲你是接近你的答案,但下面的一些變化將滿足您的輸出

{ 
    "$match": { 
    "hostId": { 
     "$in": [ 
      "192.168.20.20", 
      "192.168.20.21", 
      "192.168.20.22" 
     ] 
    }, 
    "customerId": "54a32e9f1e14fa5476d654db" 
    } 
}, 
{ 
    "$group": { 
    "_id": { 
     "hostId": "$hostId", 
     "runtime": "$runtimeMilliSeconds" 
    } 
    } 
}, 
{ 
    "$sort": { 
    "_id.runtime": -1 
    } 
}{ 
    "$group": { 
    "_id": "$_id.hostId", 
    "runtime": { 
     "$first": "$_id.runtime" 
    } 
    } 
} 
2

使用$first操作

db.test.aggregate(
[ 
    { "$match" : { "hostId" : { "$in" : [ "192.168.20.20" , "192.168.20.21" , "192.168.20.22"]} , "customerId" : "54a32e9f1e14fa5476d654db"}}, 
    { "$sort" : { "runtimeMilliSeconds" : -1}}, 
    { "$group" : { "_id" : { "hostId" : "$hostId" } , "runtime" : { $first : "$runtimeMilliSeconds" }}}, 
    { "$project" : { "hostId" : "$_id.hostId" , "runtimeMilliSeconds" : "$runtime" , "_id" : 0}} 
] 
) 

輸出將是:

{ 
    "result" : [ 
     { 
      "hostId" : "192.168.20.20", 
      "runtimeMilliSeconds" : 1422008101736 
     }, 
     { 
      "hostId" : "192.168.20.21", 
      "runtimeMilliSeconds" : 1422009901379 
     }, 
     { 
      "hostId" : "192.168.20.22", 
      "runtimeMilliSeconds" : 1422010801685 
     } 
    ], 
    "ok" : 1 
} 
2

的最有效的方法是使用$max ope rator(不需要$ sort階段需要):

[ 
    {"$match" : { 
     "hostId" : { "$in" : [ "192.168.20.20" , "192.168.20.21" , "192.168.20.22"]}, 
     "customerId" : "54a32e9f1e14fa5476d654db" 
    }}, 
    { "$group" : { 
     "_id" : "$hostId", 
     "runtime" : {"$max" : "$runtimeMilliSeconds"} 
    }}, 
    {"$project" : { 
     "hostId" : "$_id" , 
     "runtime" : 1, 
     "_id" : 0 
    }} 
] 
+0

$ max is better +1 – Disposer 2015-02-12 08:02:14

相關問題