Spring Data MongoDB - 按多个字段排序不起作用

时间:2015-08-31 11:06:02

标签: java spring mongodb sorting spring-data-mongodb

我有一个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);

但它也不起作用! :(

2 个答案:

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