Caso para "próximo"
A distância considerada será sempre do ponto "mais próximo" de qualquer objeto GeoJSON armazenado. O mesmo vale para Polygon, ou MultiPolygon e realmente todos os objetos GeoJSON que são válidos para armazenamento.
Considere isto:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
E se usarmos a agregação
$geoNear
como meio de nos mostrar a distância de um determinado local:db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Isso nos diz que a distância é considerada de 824 metros.
Agora, se você considerou cada "Ponto" como seu próprio documento na coleção e executou o mesmo processo de consulta:
{
"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
}
Então você vê as diferentes distâncias de cada ponto do ponto de origem é a consulta, onde no primeiro caso apenas o "mais próximo" foi realmente considerado para todo o objeto.
Então fica a prova, que a distância considerada com
$near
/$geoNear
ou é sempre apenas o ponto mais próximo da origem usada na consulta. Caso para $geoWithin
O
$geoWithin
operação é, porém, diferente. Considere o documento original "MultiPoint" e, em seguida, esta consulta: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
]
]
]
}
}
}
})
Isso não retornará nenhum resultado, e não retornará porque "nem todos" os componentes Point do Object estão dentro dos limites do polígono tge usado na consulta. Mas se você considerar cada ponto como um único documento:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Então, dois dos pontos seriam vistos dentro do polígono. Mas como eles não são armazenados como documentos individuais, mas como parte de um "MutiPoint", a menos que todos partes desse Objeto estiverem contidas na forma, o resultado será falso e o documento não será retornado.
O mesmo é verdade aqui para todos os objetos GeoJSON que contêm essencialmente uma coleção de "Point" em alguma representação.