sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Un Mongo $near devolverá documentos para los cuales cualquier punto en un Multipunto está dentro del rango?

Caso de "cerca"

La distancia considerada siempre será desde el punto "más cercano" de cualquier Objeto GeoJSON almacenado. Lo mismo ocurre con Polygon o MultiPolygon y realmente con todos los objetos GeoJSON que son válidos para el almacenamiento.

Considere esto:

{
    "location": {
       "type": "MultiPoint",
       "coordinates": [
          [ -73.9580, 40.8003 ],
          [ -73.9498, 40.7968 ],
          [ -73.9737, 40.7648 ],
          [ -73.9814, 40.7681 ]
       ]
    }
}

Y si usamos agregación $geoNear como un medio para mostrarnos la distancia desde una ubicación dada:

db.geo.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [
               -73.97661209106445,
               40.774561857347244
            ]
        },
        "spherical": true,
        "distanceField": "distance"
    }}
])

Esto nos dice que la distancia se considera de 824 metros.

Ahora, si consideró cada "Punto" como su propio documento en la colección y ejecutó el mismo proceso 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
}

Luego, verá las diferentes distancias de cada punto desde el punto de origen en la consulta, donde en el primer caso solo se consideró el "más cercano" para todo el objeto.

Así que ahí está la prueba, que la distancia considerada con $near /$geoNear o siempre es solo el punto más cercano al origen utilizado en la consulta.

Caso para $geoDentro

El $geoWithin sin embargo, el funcionamiento es diferente. Considere el documento original "MultiPoint" y luego 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
                    ]
                  ]
                ]
            }
        }
    }
})

Esto no devolverá ningún resultado, y no lo hará porque "no todos" los componentes de punto del objeto se encuentran dentro de los límites del polígono tge utilizado en la consulta. Pero si consideraras cada punto como un solo documento:

{
        "_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9737,
                        40.7648
                ]
        }
}
{
        "_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9814,
                        40.7681
                ]
        }
}

Entonces se vería que dos de los puntos están dentro del polígono. Pero dado que estos no se almacenan como documentos individuales sino como parte de un "MutiPoint", a menos que todos partes de ese Objeto están contenidas dentro de la forma, entonces el resultado es falso y no se devuelve el documento.

Lo mismo es cierto aquí para todos los Objetos GeoJSON que esencialmente contienen una colección de "Punto" en alguna representación.