Не можете да направите това по този начин — по принцип не можете да базирате нищо във вашите MongoDB заявки на стойности в колекциите.
От MongoDB 2.4 обаче поддържаме нов индекс, наречен 2dsphere
което ви позволява да съхранявате не само точки в базата данни, но и полигони. Бихте съхранили тази информация в документ като:
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );
След това можете да използвате заявка за „пресичане“, за да разберете дали дадена точка е покрита от всеки от полигоните:
db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );
Което след това връща:
{
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}
Тук намира пожарната, защото 0, 0 е в средата на полигона. Сега номерът, разбира се, е да се изчислят многоъгълните точки, които образуват кръг, който е на "радиус" (да речем 10 км) от централната точка. Няма да можете да получите истински кръг, но шестоъгълник или осмоъгълник трябва да е достатъчно добър. Математиката за това не е изключително проста, но http:// www.movable-type.co.uk/scripts/latlong.html#destPoint има пример в JavaScript. Просто завъртете посоката си в 8 стъпки от 0 до 2PI, за да изчислите точките по обиколката на кръга и ги поставете в координатите. Не забравяйте да ги вградите в двойно вложен масив и да направите първия и последния еднакви:
{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}