2016-05-04 32 views
1

我一直在嘗試使用MongoDB Aggregation操作符來獲取最後一條記錄(基於'fixtm',它是fixtime)。每條記錄都有一個設備ID,修復時間和一些其他信息,如緯度,經度,速度等。我下面的聚合工作正常,它返回給我每個設備的最後一個記錄。但是,我怎樣才能獲得緯度,經度等其他領域呢?我曾嘗試在$項目列表中添加諸如lat: 1之類的內容,但無論我嘗試了多少變體,其他值都不顯示。我認爲這是因爲它們不存在於組運營商的_id字段或什麼東西?任何指針都會非常有幫助。由於MongoDB聚合 - 分組依據,在結果中選擇其他字段

function() { 
    return db.gpspos.aggregate(
     [ 
      { 
       $sort: { 
        devid: 1, 
        fixtm: 1 
       } 
      }, { 
       $group: { 
        _id: "$devid", 
        lastData: { 
         $last: "$fixtm" 
        } 
       } 
      }, { 
       $project: { 
        _id: 0, 
        device_id: '$_id', 
        fixtime: '$lastData' 
       } 
      } 
     ] 
    ) 
} 

什麼,我從上面得到的是

{ "device_id" : 5, "fixtime" : 1462368405000 } 
{ "device_id" : 4, "fixtime" : 1462372097000 } 

我所看到的是在我的MongoDB

{ 
    "_id": { 
     "$oid": "5729dc83f5be2411fb28c7c3" 
    }, 
    "devid": 5, 
    "devnm": "M.M (Samsung S3)", 
    "fixtm": 1462360893000, 
    "addr": "{address}", 
    "lat": 1.433775, 
    "lon": 103.7859717, 
    "spdkm": 0 
} 

{ "device_id" : 5, "fixtime" : 1462368405000, "speed": 70.3, "lat": 103.33434 } 
{ "device_id" : 4, "fixtime" : 1462372097000, "speed": 70.3, "lat": 101.33434 } 

文檔的例子

+0

您是否可以編輯您的問題以包含您使用上述結果獲得的一些示例文檔? – chridam

+0

當然chridam,完成 –

回答

2

返回其他字段s,您可以在您的$group操作中使用相同的$last運營商。這將返回每個組的最後一個文檔的相應字段:

function() { 
    return db.gpspos.aggregate(
     [ 
      { 
       $sort: { 
        devid: 1, 
        fixtm: 1 
       } 
      }, { 
       $group: { 
        _id: "$devid", 
        lastData: { $last: "$fixtm" }, 
        speed: { $last: "$spdkm" }, 
        address: { $last: "$address" }, 
        lat: { $last: "$lat" }, 
        lon: { $last: "$lon" } 
       } 
      }, { 
       $project: { 
        _id: 0, 
        device_id: '$_id', 
        fixtime: '$lastData', 
        speed: 1, 
        address: 1, 
        lat: 1, 
        lon: 1 
       } 
      } 
     ] 
    ) 
} 
+0

哦,所以我將不得不使用$最後累加器在其他領域,即使我需要的是基於fixtm(unix時間)的最後一個記錄?所以我想它首先找到fixtm的最後一個記錄,然後剩下的 - 所以它不會影響返回的內容?這是邏輯嗎? –

+0

想象一下Linux「管道」上下文中的聚合管道;當執行一個流水線時,MongoDB將操作符互相連接,即操作符的輸出成爲後面的操作符的輸入。每個操作員的結果都是一個新的文檔集合。所以當你想在最後的流水線階段返回字段時,它們應該是前一個操作符的結果,在這種情況下,其他字段應該來自'$ group'流水線。就像在SQL中一樣,除非使用任何聚合函數,否則不能使用GROUP BY。在MongoDB中,你將不得不使用'$ last'或$ first' – chridam

+0

好吧,我有點兒得到它,但只是簡單的澄清 - 如果我需要包含一個不是數字的字段會怎麼樣。例如說地址(addr)。 $最後會如何抵制呢?對不起,我對MongoDB是全新的,所以試圖緩慢地消化東西:) –

相關問題