Sprawa na „blisko”
Rozważana odległość zawsze będzie od „najbliższego” punktu dowolnego przechowywanego obiektu GeoJSON. To samo dotyczy Polygon lub MultiPolygon i tak naprawdę wszystkich obiektów GeoJSON, które są ważne do przechowywania.
Rozważ to:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
A jeśli użyjemy agregacji $geoNear
jako sposób na pokazanie nam odległości od danej lokalizacji:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
To mówi nam, że odległość jest uważana za 824 metry.
Teraz, jeśli uznasz każdy „punkt” za własny dokument w kolekcji i uruchomisz ten sam proces zapytania:
{
"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
}
Następnie widzisz różne odległości każdego punktu od punktu początkowego jest zapytaniem, gdzie w pierwszym przypadku tylko "najbliższy" był faktycznie brany pod uwagę dla całego obiektu.
Mamy więc dowód, że odległość brana pod uwagę z $near
/$geoNear
lub jest zawsze tylko najbliższy punkt źródła użytego w zapytaniu.
Sprawa na $geoWithin
$geoWithin
operacja jest jednak inna. Rozważ oryginalny dokument „MultiPoint”, a następnie to zapytanie:
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
]
]
]
}
}
}
})
Nie zwróci to żadnego wyniku i nie zwróci, ponieważ "nie wszystkie" składniki Point obiektu Object leżą w granicach tge Polygon użytego w zapytaniu. Ale jeśli potraktowałeś każdy punkt jako pojedynczy dokument:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Wtedy dwa z tych punktów byłyby widoczne wewnątrz wielokąta. Ale ponieważ nie są one przechowywane jako pojedyncze dokumenty, ale jako część „MutiPoint”, to chyba że wszystkie części tego obiektu są zawarte w kształcie, wynik jest fałszywy, a dokument nie jest zwracany.
To samo dotyczy wszystkich obiektów GeoJSON, które zasadniczo zawierają kolekcję „Point” w jakiejś reprezentacji.