Val för "nära"
Avståndet som beaktas kommer alltid att vara från den "närmaste" punkten för alla lagrade GeoJSON-objekt. Detsamma gäller för Polygon, eller MultiPolygon och egentligen alla GeoJSON-objekt som är giltiga för lagring.
Tänk på detta:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
Och om vi använder aggregering $geoNear
som ett sätt att visa oss avståndet från en given plats:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Detta säger oss att avståndet anses vara 824 meter.
Om du nu betraktade varje "Point" som sitt eget dokument i samlingen istället och körde samma frågeprocess:
{
"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
}
Sedan ser du de olika avstånden för varje punkt från utgångspunkten är frågan, där i det förra fallet bara det "närmaste" faktiskt beaktades för hela objektet.
Så det finns beviset på att avståndet betraktat med $near
/$geoNear
eller är alltid endast den närmaste punkten till ursprunget som används i frågan.
Case för $geoWithin
$geoWithin
driften är dock annorlunda. Tänk på det ursprungliga "MultiPoint"-dokumentet och sedan denna fråga:
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
]
]
]
}
}
}
})
Detta kommer inte att returnera något resultat, och det kommer inte att göra det eftersom "inte alla" punktkomponenter i objektet ligger inom gränserna för den polygon som används i frågan. Men om du betraktade varje punkt som ett enda dokument:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Då skulle två av punkterna ses vara inne i polygonen. Men eftersom dessa inte lagras som enskilda dokument utan som en del av en "MutiPoint", såvida inte alla delar av det objektet finns i formen, då är resultatet falskt och dokumentet returneras inte.
Detsamma gäller här för alla GeoJSON-objekt som i huvudsak innehåller en samling "Point" i någon representation.