我可以在聚合框架中获取只有最新日期的字段的不同值吗?

Can I get distinct values of a field with only the latest date in the Aggregation framework?

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

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

因为有了这个实时数据,出租车不断地向集合发送新的文档,以及新的下车时间和 GPS 坐标。我只想要最近下车时间每个不同出租车牌照的 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));

您基本上是在寻找 $last operator. This is commonly used with $sort,它 returns 在分组边界找到 "last" 文档属性。

基本管道:

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

或者专门用 Java 驱动程序构建:

  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);