MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Um Mongo $near retornará documentos para os quais qualquer ponto em um MultiPoint esteja dentro do alcance?

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.