1

当我尝试使用带有排序的 NearQuery 进行查询时,我在 Spring 中遇到了 mongoTemplate 的问题。排序不起作用:

Query query = new Query();
query.with(new Sort(Direction.DESC, "timeStamp"));
Criteria criteria = new Criteria();
criteria.and("type").is("MeasurementPoint");
query.addCriteria(criteria);

NearQuery queryN = NearQuery.near(p).maxDistance(new Distance(distance, Metrics.KILOMETERS)).num(range).query(query);
GeoResults<MeasurementPoint> geoPoints = mongoTemplate.geoNear(queryN, MeasurementPoint.class);

我不知道我做错了什么,但 geoResult 返回我第一个匹配,而不是最后一个(排序 DESC)。所以,我假设排序工作不正常。

任何想法?它是一个错误吗?

谢谢!

4

1 回答 1

2

不幸的是,不可能对 geoNear 结果进行排序,因为它不返回游标,并且默认排序是与点的距离。您可以做的是在 Java 代码中手动对结果进行排序。请注意,下面的代码忽略了距离并仅按“timeStamp”排序。

List<GeoResult<Person>> results = geoPoints.getContent();
Collections.sort(results, new Comparator<GeoResult<Person>>() {
    @Override
    public int compare(GeoResult<Person> o1, GeoResult<Person> o2) {
        return o1.getContent().getTimeStamp() == 2.getContent().getTimeStamp() ? 0 : 
                (o1.getContent().getTimeStamp() > o2.getContent().getTimeStamp() ? 1 : -1) ;
        }
    });

另一种方法是使用 $geoWithin 和 $centerSphere。由于您以一定的距离(距离变量)限制结果,这可能会起作用。

    Query query = Query.query(Criteria.where("coords").withinSphere(new Circle(p, new Distance(distance, Metrics.KILOMETERS).getNormalizedValue())));
    query.with(new Sort(Direction.DESC, "timeStamp"));
    Criteria criteria = new Criteria();
    criteria.and("type").is("MeasurementPoint");
    query.addCriteria(criteria);

    List<Person> geoPoints = mongoTemplate.find(query, MeasurementPoint.class);

您可以在此处找到有关 $geoWithin 和 $centerSphere 的更多信息:

http://docs.mongodb.org/manual/reference/operator/geoWithin/

http://docs.mongodb.org/manual/reference/operator/centerSphere/

于 2013-06-28T12:00:33.473 回答