Калъф за „близо“
Разглежданото разстояние винаги ще бъде от „най-близката“ точка на всеки съхранен GeoJSON обект. Същото важи за Polygon или MultiPolygon и наистина всички GeoJSON обекти, които са валидни за съхранение.
Помислете за това:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
И ако използваме агрегиране $geoNear
като средство да ни покаже разстоянието от дадено местоположение:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Това ни казва, че разстоянието се счита за 824 метра.
Сега, ако смятате всяка „Точка“ за свой собствен документ вместо в колекцията и изпълните същия процес на заявка:
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
},
"distance" : 824.837276194968
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
},
"distance" : 1114.0666715946495
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.958,
40.8003
]
},
"distance" : 3266.4720692258156
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9498,
40.7968
]
},
"distance" : 3351.9091229713567
}
След това виждате различните разстояния на всяка точка от точката на произход е заявката, където в първия случай само „най-близкото“ всъщност е взето предвид за целия обект.
Така че има доказателство, че разстоянието, разглеждано с $near
/$geoNear
или винаги е самос най-близката точка до източника, използван в заявката.
Калъф за $geoWithin
$geoWithin
операцията обаче е различна. Помислете за оригиналния документ "MultiPoint" и след това за тази заявка:
db.geo.find({
"location": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
[
[
-73.98382186889648,
40.75961056635002
],
[
-74.00030136108398,
40.782751138401245
],
[
-73.97317886352539,
40.78950978441435
],
[
-73.95910263061523,
40.7720918760227
],
[
-73.98382186889648,
40.75961056635002
]
]
]
}
}
}
})
Това няма да върне никакъв резултат и няма, защото „не всички“ Point компоненти на обекта лежат в границите на tge Polygon, използван в заявката. Но ако разглеждате всяка точка като един документ:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Тогава ще се види, че две от точките са вътре в многоъгълника. Но тъй като те не се съхраняват като отделни документи, а като част от "MutiPoint", тогава освен ако всички части от този обект се съдържат във формата, тогава резултатът е false и документът не се връща.
Същото важи и тук за всички GeoJSON обекти, които по същество съдържат колекция от „Точка“ в някакво представяне.