@ -17,7 +17,9 @@ package org.springframework.data.mongodb.core.aggregation;
@@ -17,7 +17,9 @@ package org.springframework.data.mongodb.core.aggregation;
import org.bson.Document ;
import org.springframework.data.mongodb.core.query.NearQuery ;
import org.springframework.lang.Nullable ;
import org.springframework.util.Assert ;
import org.springframework.util.StringUtils ;
/ * *
* Represents a { @code geoNear } aggregation operation .
@ -33,21 +35,47 @@ public class GeoNearOperation implements AggregationOperation {
@@ -33,21 +35,47 @@ public class GeoNearOperation implements AggregationOperation {
private final NearQuery nearQuery ;
private final String distanceField ;
private final @Nullable String indexKey ;
/ * *
* Creates a new { @link GeoNearOperation } from the given { @link NearQuery } and the given distance field . The
* { @code distanceField } defines output field that contains the calculated distance .
*
* @param q uery must not be { @literal null } .
* @param nearQ uery must not be { @literal null } .
* @param distanceField must not be { @literal null } .
* /
public GeoNearOperation ( NearQuery nearQuery , String distanceField ) {
this ( nearQuery , distanceField , null ) ;
}
/ * *
* Creates a new { @link GeoNearOperation } from the given { @link NearQuery } and the given distance field . The
* { @code distanceField } defines output field that contains the calculated distance .
*
* @param nearQuery must not be { @literal null } .
* @param distanceField must not be { @literal null } .
* @param indexKey can be { @literal null } ;
* /
private GeoNearOperation ( NearQuery nearQuery , String distanceField , @Nullable String indexKey ) {
Assert . notNull ( nearQuery , "NearQuery must not be null." ) ;
Assert . hasLength ( distanceField , "Distance field must not be null or empty." ) ;
this . nearQuery = nearQuery ;
this . distanceField = distanceField ;
this . indexKey = indexKey ;
}
/ * *
* Optionally specify the geospatial index to use via the field to use in the calculation . < br / >
* < strong > NOTE : < / strong > Requires MongoDB 4 . 0 or later .
*
* @param key the geospatial index field to use when calculating the distance .
* @return new instance of { @link GeoNearOperation } .
* @since 2 . 1
* /
public GeoNearOperation useIndex ( String key ) {
return new GeoNearOperation ( nearQuery , distanceField , key ) ;
}
/ *
@ -60,6 +88,10 @@ public class GeoNearOperation implements AggregationOperation {
@@ -60,6 +88,10 @@ public class GeoNearOperation implements AggregationOperation {
Document command = context . getMappedObject ( nearQuery . toDocument ( ) ) ;
command . put ( "distanceField" , distanceField ) ;
if ( StringUtils . hasText ( indexKey ) ) {
command . put ( "key" , indexKey ) ;
}
return new Document ( "$geoNear" , command ) ;
}
}