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 は最後の一致 (Sorted DESC) ではなく、最初の一致を返します。したがって、Sort が正しく機能していないと思います。

何か案が?バグですか?

ありがとう!

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 に答える