Няма да можете да направите това с нормална заявка, тъй като не можете динамично да задавате разстоянието за документ. От MongoDB 2.4 можете да направите това с рамката за агрегиране, тъй като те са добавили оператора geoNear към началото на тръбопроводите.
Първият етап ще бъде geoNear, който е много подобен на командата geonear. Като резултат ще получим и разстоянието от посочената точка (10,10) до документа.
На втория етап ще трябва да използваме оператора на проекта, за да рекламираме разликата между полето за максимално разстояние и изчисленото geoNear разстояние.
И накрая, съпоставяме онези документи, които имат положителна делта ((максимално разстояние)> 0).
Ето тръбопровода, използващ Асинхронен Java драйвер помощни класове на.
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()));
}
}
И ето тръбопроводът е създаден:
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 - Роб.
P.S. Конструкторите по-горе използват предварителна версия на 1.2.0 версия на драйвера. Кодът преминава през матрицата за изграждане, докато пиша, и трябва да бъде пуснат до петък, 22 март 2013 г.