我是否可以在聚合框架中获得仅具有最新日期的字段的不同值?

时间:2015-01-14 03:21:39

标签: java mongodb mongodb-query aggregation-framework

我有一个充满出租车数据的集合,看起来像这样(简化):

{
     "TaxiLicense" : "TET123",
     "GetOff" : "2015-01-10,00:02:11",
     "GetOffLongitude" : 121.41
}

由于这个实时数据,出租车不断向新的文件发送新文件,并带有新的GetOff时间和GPS坐标。我只希望在最近的GetOff时间为每个不同的出租车许可证提供GPS坐标。

聚合框架是否有办法在Java中执行此操作,或者我是否需要聚合所有条目,然后让我的Java程序找到每个独特出租车的最新时间?

我目前正在使用

DBObject taxigroup = new BasicDBObject("$group",
                               new BasicDBObject("_id", 
                                   new BasicDBObject("License","$TaxiLicense")
                                   .append("getoff","$GetOff").append("longitude","GetOffLongitude"))
                               );
AggregationOutput aggout = taxistationOfCollection.aggregate( Arrays.asList(taxigroup));

1 个答案:

答案 0 :(得分:1)

您基本上在寻找$last运营商。这通常与$sort一起使用,它返回在分组边界找到的“最后”文档属性。

基本渠道:

[
    { "$sort": { "TaxiLicence": 1, "GetOff": 1 } },
    { "$group": {
        "_id": "$TaxiLicence",
       "GetOff": { "$last": "$GetOff" },
       "GetOffLongitude": { "$last": "$GetOffLongitude" }
    }}
]

或者专门用Java Driver构建:

  DBObject sort = new BasicDBObject("$sort",
      new BasicDBObject("TaxiLicence", 1)
          .append("GetOff",1)
  );

  DBObject group = new BasicDBObject("$group",
      new BasicDBObject("_id", "$TaxiLicence"
          .append("GetOff", new BasicDBObject( "$first", "$GetOff" ) )
          .append("GeOffLongitude", new BasicDBObject( "$first", "$GeOffLongitude" ))
  );

  AggregationOutput aggout = taxistationOfCollection.aggregate(sort,group);