MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Un Mongo $near renverra-t-il des documents pour lesquels n'importe quel point d'un MultiPoint est à portée ?

Cas pour "proche"

La distance considérée sera toujours à partir du point "le plus proche" de tout objet GeoJSON stocké. Il en va de même pour Polygon, ou MultiPolygon et vraiment tous les objets GeoJSON valides pour le stockage.

Considérez ceci :

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

Et si nous utilisons l'agrégation $geoNear comme moyen de nous montrer la distance d'un emplacement donné :

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

Cela nous indique que la distance est considérée comme étant de 824 mètres.

Maintenant, si vous considérez chaque "Point" comme son propre document à la place dans la collection, et exécutez le même processus de requête :

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

Ensuite, vous voyez les différentes distances de chaque point à partir du point d'origine dans la requête, où dans le premier cas, seul le "plus proche" était réellement pris en compte pour l'ensemble de l'objet.

Voilà donc la preuve, que la distance considérée avec $near /$geoNear ou est toujours seulement le point le plus proche de l'origine utilisé dans la requête.

Cas pour $geoWithin

Le $geoWithin le fonctionnement est cependant différent. Considérez le document "MultiPoint" d'origine, puis cette requête :

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

Cela ne renverra aucun résultat, et ce ne sera pas le cas parce que "tous" les composants Point de l'objet ne se trouvent pas dans les limites du polygone utilisé dans la requête. Mais si vous considérez chaque point comme un seul document :

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

Ensuite, deux des points seraient considérés comme étant à l'intérieur du polygone. Mais comme ceux-ci ne sont pas stockés en tant que documents individuels mais dans le cadre d'un "MutiPoint", alors à moins que tous des parties de cet objet sont contenues dans la forme, le résultat est faux et le document n'est pas renvoyé.

La même chose est vraie ici pour tous les objets GeoJSON qui contiennent essentiellement une collection de "Point" dans une certaine représentation.