Du vil ikke være i stand til at gøre dette med en normal forespørgsel, da du ikke dynamisk kan indstille afstanden pr. dokument. Fra MongoDB 2.4 kan du gøre dette med aggregeringsrammerne, da de har tilføjet geoNear-operatøren til starten af pipelines.
Den første fase vil være geoNear, som minder meget om geonear-kommandoen. Vi vil også få afstanden fra det angivne punkt (10,10) til dokumentet som et resultat.
Den anden fase bliver vi nødt til at bruge projektoperatøren til at adskille forskellen mellem maximumDistance-feltet og den beregnede geoNear-afstand.
Til sidst matcher vi de dokumenter, der har et positivt delta ((max - afstand)> 0).
Her er pipelinen ved hjælp af asynkron Java-driver 's hjælperklasser.
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()));
}
}
Og her er pipelinen oprettet:
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.
P.S. Builderne ovenfor bruger en forhåndsudgivelse af 1.2.0-versionen af driveren. Koden gennemgår byggematrixen, mens jeg skriver og skulle være frigivet fredag den 22. marts 2013.