2016-05-04 31 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是全新的,所以试图缓慢地消化东西:) –

相关问题