我有一个MongoRepository,其中包含以下方法:
Position findFirstByDeviceIdAndSensorUsedIsIn(String deviceId, String[] sensorsUsed, Sort sort);
我称之为:
return posRepo.findFirstByDeviceIdAndSensorUsedIsIn(deviceId, VALID_SENSORS, new Sort(new Sort.Order(Sort.Direction.DESC, "Time"), new Sort.Order(Sort.Direction.DESC, "TimeReceived")));
VALID_SENSORS是一个包含2个条目的String-Array。
现在的问题是,它按时间排序,但第二个维度(TimeReceived)是随机的。 mongodb驱动程序的TRACE-Output是:
com.mongodb.TRACE:find:company.position {" $ query" :{" device_id" :" testId" ," sensor_used" :{" $ in" :[" CELL_LOCATE" ," GPS"]}}," $ orderby" :{"时间" :-1," time_rcvd" :-1}}
当我使用我的mongoclient robomongo尝试以下查询时,顺序是正确的。这是查询:
db.getCollection('position').find({device_id:'testdevice'}).sort({time:-1,time_rcvd:-1}).limit(5)
什么会导致这种奇怪的行为?
修改 我还在我的spring应用程序中尝试了以下代码:
TypedAggregation<Position> agg = newAggregation(Position.class,
match(where("deviceId").is(deviceId).andOperator(where("sensorUsed").in(VALID_SENSORS))),
sort(Sort.Direction.DESC, "time"),
sort(Sort.Direction.DESC, "timeReceived"),
limit(1)
);
AggregationResults<Position> result = template.aggregate(agg, Position.class);
但它也不起作用! :(
答案 0 :(得分:0)
您需要使用Mongo 2.2中引入的Aggregation framework。
$unwind
是重要的操作,它复制聚合管道中的每个文档,每个数组元素执行一次。您需要展开{{1}}和time
,然后展开$sort
。
答案 1 :(得分:0)
使用聚合框架,您可以执行以下操作:
TypedAggregation<Position> agg = newAggregation(Position.class,
match(
where("deviceId").is(deviceId).andOperator(
where("sensorUsed").in(VALID_SENSORS)
)
),
sort(Sort.Direction.DESC, "time").and(Sort.Direction.DESC, "timeReceived"),
limit(1)
);
AggregationResults<Position> result = template.aggregate(agg, Position.class);