我有一个充满出租车数据的集合,看起来像这样(简化):
{
"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));
答案 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);