2014-07-26 104 views
0
獲取最新的文件

需要一個單一的查詢獲取最新的文件 - MongoDB的單查詢MongoDB中

我有一個MongoDB的集合這樣,

db.file_info.find() 

{ "_id" : A, "fileID" : 0, "size" : 126, "version" : 1} 

{ "_id" : B, "fileID" : 1, "size" : 126, "version" : 1} 

{ "_id" : C, "fileID" : 2, "size" : 121, "version" : 1} 

{ "_id" : D, "fileID" : 1, "size" : 124, "version" : 2} 

{ "_id" : E, "fileID" : 3, "size" : 125, "version" : 2} 

{ "_id" : F, "fileID" : 2, "size" : 120, "version" : 3} 

{ "_id" : G, "fileID" : 4, "size" : 122, "version" : 3} 

我要查詢最新版本文件ID的按版本排序。

我需要這樣的結果,

{ "_id" : G, "fileID" : 4, "size" : 122, "version" : 3} 

{ "_id" : E, "fileID" : 3, "size" : 125, "version" : 2} 

{ "_id" : F, "fileID" : 2, "size" : 120, "version" : 3} 

{ "_id" : D, "fileID" : 1, "size" : 124, "version" : 2} 

{ "_id" : A, "fileID" : 0, "size" : 126, "version" : 1} 

我找不到這使上述結果的查詢。目前,我們正在解決這個問題,因爲這種方式:

db.file_info.find({"version":{$lte:3}}).sort({"version":1}); 

它會列出這比第3版。較小的有序所有文件然後,我們正在處理的結果集的存儲和獲取最新版本。 但是這對於較大的收藏不可擴展。如果我們可以將它作爲單個查詢執行,那對我的項目會更好。

回答

0
db.file_info.aggregate({$group: {_id : '$_id', fileID: '$fileID', size: '$size', version: {$max: '$version'}}}) 
+0

感謝您的答覆。 – user3879526

0

您將與aggregate,不find做到這一點:

db.file_info.aggregate([ 
    // Descending sort of all docs on version 
    {$sort: {version: -1}}, 
    // Group the docs by fileID, taking the fields from the first doc in each 
    // group. Because of the previous sort, this gets the fields from the doc 
    // with the highest version. 
    {$group: { 
     _id: '$fileID', 
     origid: {$first: '$_id'}, 
     size: {$first: '$size'}, 
     version: {$first: '$version'} 
    }}, 
    // Reshape the docs to restore the original structure. 
    {$project: { 
     _id: '$origid', 
     fileID: '$_id', 
     size: '$size', 
     version: '$version' 
    }} 
]) 

輸出

{ 
    "result" : [ 
     { 
      "_id" : "A", 
      "size" : 126, 
      "version" : 1, 
      "fileID" : 0 
     }, 
     { 
      "_id" : "E", 
      "size" : 125, 
      "version" : 2, 
      "fileID" : 3 
     }, 
     { 
      "_id" : "D", 
      "size" : 124, 
      "version" : 2, 
      "fileID" : 1 
     }, 
     { 
      "_id" : "G", 
      "size" : 122, 
      "version" : 3, 
      "fileID" : 4 
     }, 
     { 
      "_id" : "F", 
      "size" : 120, 
      "version" : 3, 
      "fileID" : 2 
     } 
    ], 
    "ok" : 1 
} 
+0

感謝您的回覆。我會檢查並更新結果。 – user3879526