MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Un Mongo $near restituirà documenti per i quali qualsiasi punto in un MultiPoint è entro l'intervallo?

Caso per "vicino"

La distanza considerata sarà sempre dal punto "più vicino" di qualsiasi Oggetto GeoJSON memorizzato. Lo stesso vale per Polygon, o MultiPolygon e davvero tutti gli oggetti GeoJSON validi per l'archiviazione.

Considera questo:

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

E se utilizziamo l'aggregazione $geoNear come mezzo per mostrarci la distanza da un determinato luogo:

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

Questo ci dice che la distanza è considerata 824 metri.

Ora, se hai considerato ogni "Punto" come un proprio documento invece nella raccolta ed hai eseguito lo stesso processo di query:

{
        "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
}

Quindi vedi le diverse distanze di ogni punto dal punto di origine è la query, dove nel primo caso è stato effettivamente considerato solo il "più vicino" per l'intero oggetto.

Quindi c'è la prova, che la distanza considerata con $near /$geoNear o è sempre solo il punto più vicino all'origine utilizzato nella query.

Caso per $geoWithin

Il $geoWithin il funzionamento è però diverso. Considera il documento originale "MultiPoint" e poi questa query:

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
                    ]
                  ]
                ]
            }
        }
    }
})

Questo non restituirà alcun risultato e non lo farà perché "non tutti" i componenti Point dell'oggetto si trovano entro i limiti del poligono tge utilizzato nella query. Ma se considerassi ogni punto come un unico documento:

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

Quindi due dei punti sarebbero visti all'interno del Poligono. Ma poiché questi non vengono archiviati come singoli documenti ma come parte di un "MutiPoint", a meno che tutti parti di quell'Oggetto sono contenute all'interno della forma, quindi il risultato è falso e il documento non viene restituito.

Lo stesso vale per tutti gli oggetti GeoJSON che essenzialmente contengono una raccolta di "Punti" in alcune rappresentazioni.