Bạn sẽ không thể thực hiện việc này với một truy vấn thông thường vì bạn không thể đặt động khoảng cách cho mỗi tài liệu. Kể từ MongoDB 2.4, bạn có thể thực hiện việc này với khung tổng hợp vì họ đã thêm toán tử geoNear vào đầu các đường ống.
Giai đoạn đầu tiên sẽ là geoNear rất giống với lệnh geonear. Kết quả là chúng tôi cũng sẽ nhận được khoảng cách từ điểm được chỉ định (10,10) đến tài liệu.
Giai đoạn thứ hai, chúng tôi sẽ cần sử dụng toán tử dự án để quảng cáo sự khác biệt giữa trường MaximumDistance và khoảng cách địa lý được tính toán.
Cuối cùng, chúng tôi đối sánh những tài liệu có delta dương ((max - distance)> 0).
Đây là quy trình sử dụng Trình điều khiển Java không đồng bộ các lớp trợ giúp của.
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()));
}
}
Và đây là đường dẫn được tạo:
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. Các nhà xây dựng ở trên đang sử dụng bản phát hành trước của phiên bản 1.2.0 của trình điều khiển. Mã sẽ đi qua ma trận xây dựng khi tôi nhập và sẽ được phát hành trước Thứ Sáu, ngày 22 tháng 3 năm 2013.