Případ pro "blízko"
Uvažovaná vzdálenost bude vždy od „nejbližšího“ bodu jakéhokoli uloženého objektu GeoJSON. Totéž platí pro Polygon nebo MultiPolygon a skutečně všechny GeoJSON objekty, které jsou platné pro ukládání.
Zvažte toto:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
A pokud použijeme agregaci $geoNear
jako prostředek k zobrazení vzdálenosti od daného místa:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
To nám říká, že vzdálenost je považována za 824 metrů.
Nyní, pokud jste považovali každý „bod“ za svůj vlastní dokument místo v kolekci a spustili stejný proces dotazu:
{
"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
}
Pak vidíte různé vzdálenosti každého bodu od výchozího bodu, to je dotaz, kde v prvním případě byl pro celý objekt ve skutečnosti uvažován pouze „nejbližší“.
Existuje tedy důkaz, že vzdálenost uvažovaná s $near
/$geoNear
nebo je vždy pouze nejbližší bod k počátku použitému v dotazu.
Pouzdro pro $geoWithin
$geoWithin
provoz je však jiný. Zvažte původní dokument "MultiPoint" a poté tento dotaz:
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
]
]
]
}
}
}
})
To nevrátí žádný výsledek a nevrátí se, protože "ne všechny" Bodové komponenty objektu leží v mezích tge Polygon použitého v dotazu. Ale pokud jste považovali každý bod za jeden dokument:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Pak by se dva z bodů nacházely uvnitř mnohoúhelníku. Ale protože tyto nejsou uloženy jako jednotlivé dokumenty, ale jako součást „MutiPoint“, pak pokud všechny části tohoto objektu jsou obsaženy ve tvaru, pak je výsledek nepravdivý a dokument není vrácen.
Totéž zde platí pro všechny GeoJSON Objects, které v podstatě obsahují kolekci "Point" v nějaké reprezentaci.