Nie będziesz w stanie tego zrobić za pomocą normalnego zapytania, ponieważ nie możesz dynamicznie ustawić odległości na dokument. Od MongoDB 2.4 możesz to zrobić za pomocą struktury agregacji, ponieważ dodali operator geoNear do początków potoków.
Pierwszym etapem będzie polecenie geoNear, które jest bardzo podobne do polecenia geonear. W rezultacie otrzymamy również odległość od określonego punktu (10,10) do dokumentu.
W drugim etapie będziemy musieli użyć operatora projektu, aby dodać różnicę między polem maximumDistance a obliczoną odległością geoNear.
Na koniec dopasowujemy te dokumenty, które mają dodatnią deltę ((maks. - odległość)> 0).
Oto potok wykorzystujący asynchroniczny sterownik Java klasy pomocnicze.
package example;
import static com.allanbank.mongodb.builder.AggregationProjectFields.include;
import static com.allanbank.mongodb.builder.QueryBuilder.where;
import static com.allanbank.mongodb.builder.expression.Expressions.field;
import static com.allanbank.mongodb.builder.expression.Expressions.set;
import static com.allanbank.mongodb.builder.expression.Expressions.subtract;
import com.allanbank.mongodb.bson.element.ArrayElement;
import com.allanbank.mongodb.builder.Aggregate;
import com.allanbank.mongodb.builder.AggregationGeoNear;
import com.allanbank.mongodb.builder.GeoJson;
public class AggregateGeoNear {
public static void main(String[] args) {
Aggregate aggregate = Aggregate
.builder()
.geoNear(
AggregationGeoNear.builder()
.location(GeoJson.p(10, 10))
.distanceField("distance"))
.project(
include("name", "location", "maximumDistance"),
set("delta",
subtract(field("maximumDistance"),
field("distance"))))
.match(where("delta").greaterThanOrEqualTo(0)).build();
System.out
.println(new ArrayElement("pipeline", aggregate.getPipeline()));
}
}
A oto tworzony jest potok:
pipeline : [
{
'$geoNear' : {
near : [
10,
10
],
distanceField : 'distance',
spherical : false,
uniqueDocs : true
}
},
{
'$project' : {
name : 1,
location : 1,
maximumDistance : 1,
delta : {
'$subtract' : [
'$maximumDistance',
'$distance'
]
}
}
},
{
'$match' : {
delta : { '$gte' : 0 }
}
}
]
HTH - Rob.
PS Konstruktorzy powyżej używają wersji wstępnej sterownika w wersji 1.2.0. Kod przechodzi przez macierz kompilacji podczas pisania i powinien zostać wydany do piątku, 22 marca 2013 r.