Anda tidak akan dapat melakukan ini dengan kueri normal karena Anda tidak dapat mengatur jarak per dokumen secara dinamis. Mulai MongoDB 2.4 Anda dapat melakukannya dengan kerangka kerja agregasi karena mereka telah menambahkan operator geoNear ke awal pipeline.
Tahap pertama adalah geoNear yang sangat mirip dengan perintah geonear. Kami juga akan mendapatkan jarak dari titik yang ditentukan (10,10) ke dokumen sebagai hasilnya.
Tahap kedua kita perlu menggunakan operator proyek untuk mengiklankan perbedaan antara bidang maximumDistance dan jarak geoNear yang dihitung.
Terakhir, kami mencocokkan dokumen yang memiliki delta positif ((maks - jarak)> 0).
Berikut adalah alur menggunakan Driver Java Asinkron kelas pembantu.
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()));
}
}
Dan inilah pipeline yang dibuat:
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. Pembangun di atas menggunakan pra-rilis driver versi 1.2.0. Kode akan melalui matriks build saat saya mengetik dan akan dirilis paling lambat Jumat, 22 Maret 2013.