Fall für "nahe"
Die berücksichtigte Entfernung bezieht sich immer auf den „nächsten“ Punkt eines gespeicherten GeoJSON-Objekts. Dasselbe gilt für Polygon oder MultiPolygon und wirklich alle GeoJSON-Objekte, die für die Speicherung gültig sind.
Bedenken Sie Folgendes:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
Und wenn wir Aggregation verwenden $geoNear
um uns die Entfernung von einem bestimmten Ort anzuzeigen:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Dies sagt uns, dass die Entfernung mit 824 Metern angenommen wird.
Wenn Sie nun jeden "Punkt" stattdessen als eigenes Dokument in der Sammlung betrachten und denselben Abfrageprozess ausführen:
{
"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
}
Dann sieht man die unterschiedlichen Entfernungen der einzelnen Punkte vom Ursprungspunkt der Abfrage, wobei im ersteren Fall eigentlich nur der "nächste" für das ganze Objekt berücksichtigt wurde.
So gibt es den Beweis, dass die Distanz mit $near
berücksichtigt wird /$geoNear
oder ist immer nur der nächstgelegene Punkt zum Ursprung, der in der Abfrage verwendet wird.
Fall für $geoWithin
Der $geoWithin
Die Bedienung ist jedoch anders. Betrachten Sie das ursprüngliche "MultiPoint"-Dokument und dann diese Abfrage:
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
]
]
]
}
}
}
})
Dies wird kein Ergebnis zurückgeben, und das auch nicht, weil "nicht alle" Punktkomponenten des Objekts innerhalb der Grenzen des in der Abfrage verwendeten Polygons liegen. Aber wenn Sie jeden Punkt als ein einzelnes Dokument betrachten:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Dann würden zwei der Punkte innerhalb des Polygons liegen. Da diese aber nicht als einzelne Dokumente, sondern als Teil eines „MutiPoint“ gespeichert werden, dann eben nicht alle Teile dieses Objekts in der Form enthalten sind, ist das Ergebnis falsch und das Dokument wird nicht zurückgegeben.
Dasselbe gilt hier für alle GeoJSON-Objekte, die im Wesentlichen eine Sammlung von "Punkten" in irgendeiner Darstellung enthalten.