Bạn có thể làm điều đó với tổng hợp geoNear . Trong spring-data-mongodb GeoNearOperation đang đại diện cho tập hợp này.
Mở rộng hoặc tạo kế thừa Place
lớp với trường mà bạn muốn có thông tin khoảng cách (ví dụ với kế thừa):
public class PlaceWithDistance extends Place {
private double distance;
public double getDistance() {
return distance;
}
public void setDistance(final double distance) {
this.distance = distance;
}
}
Thay vì Criteria
với Query
sử dụng tập hợp. Đối số thứ hai của geoNear
là tên của trường mà khoảng cách sẽ được đặt:
final NearQuery nearQuery = NearQuery
.near(new Point(searchRequest.getLat(), searchRequest.getLng()));
nearQuery.num(5);
nearQuery.spherical(true); // if using 2dsphere index, otherwise delete or set false
// "distance" argument is name of field for distance
final Aggregation a = newAggregation(geoNear(nearQuery, "distance"));
final AggregationResults<PlaceWithDistance> results =
mongoTemplate.aggregate(a, Place.class, PlaceWithDistance.class);
// results.forEach(System.out::println);
List<PlaceWithDistance> ls = results.getMappedResults();
Chỉ để làm cho nó dễ dàng hơn - nhập được liên kết:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.geoNear;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GeoNearOperation;
import org.springframework.data.mongodb.core.query.NearQuery;