Caso per "vicino"
La distanza considerata sarà sempre dal punto "più vicino" di qualsiasi Oggetto GeoJSON memorizzato. Lo stesso vale per Polygon, o MultiPolygon e davvero tutti gli oggetti GeoJSON validi per l'archiviazione.
Considera questo:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
E se utilizziamo l'aggregazione $geoNear
come mezzo per mostrarci la distanza da un determinato luogo:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Questo ci dice che la distanza è considerata 824 metri.
Ora, se hai considerato ogni "Punto" come un proprio documento invece nella raccolta ed hai eseguito lo stesso processo di query:
{
"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
}
Quindi vedi le diverse distanze di ogni punto dal punto di origine è la query, dove nel primo caso è stato effettivamente considerato solo il "più vicino" per l'intero oggetto.
Quindi c'è la prova, che la distanza considerata con $near
/$geoNear
o è sempre solo il punto più vicino all'origine utilizzato nella query.
Caso per $geoWithin
Il $geoWithin
il funzionamento è però diverso. Considera il documento originale "MultiPoint" e poi questa query:
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
]
]
]
}
}
}
})
Questo non restituirà alcun risultato e non lo farà perché "non tutti" i componenti Point dell'oggetto si trovano entro i limiti del poligono tge utilizzato nella query. Ma se considerassi ogni punto come un unico documento:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Quindi due dei punti sarebbero visti all'interno del Poligono. Ma poiché questi non vengono archiviati come singoli documenti ma come parte di un "MutiPoint", a meno che tutti parti di quell'Oggetto sono contenute all'interno della forma, quindi il risultato è falso e il documento non viene restituito.
Lo stesso vale per tutti gli oggetti GeoJSON che essenzialmente contengono una raccolta di "Punti" in alcune rappresentazioni.