MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wird ein Mongo $near Dokumente zurückgeben, für die irgendein Punkt in einem MultiPoint in Reichweite ist?

Fall für "nahe"

Die berücksichtigte Entfernung bezieht sich immer auf den „nächsten“ Punkt eines gespeicherten GeoJSON-Objekts. Dasselbe gilt für Polygon oder MultiPolygon und wirklich alle GeoJSON-Objekte, die für die Speicherung gültig sind.

Bedenken Sie Folgendes:

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

Und wenn wir Aggregation verwenden $geoNear um uns die Entfernung von einem bestimmten Ort anzuzeigen:

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

Dies sagt uns, dass die Entfernung mit 824 Metern angenommen wird.

Wenn Sie nun jeden "Punkt" stattdessen als eigenes Dokument in der Sammlung betrachten und denselben Abfrageprozess ausführen:

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

Dann sieht man die unterschiedlichen Entfernungen der einzelnen Punkte vom Ursprungspunkt der Abfrage, wobei im ersteren Fall eigentlich nur der "nächste" für das ganze Objekt berücksichtigt wurde.

So gibt es den Beweis, dass die Distanz mit $near berücksichtigt wird /$geoNear oder ist immer nur der nächstgelegene Punkt zum Ursprung, der in der Abfrage verwendet wird.

Fall für $geoWithin

Der $geoWithin Die Bedienung ist jedoch anders. Betrachten Sie das ursprüngliche "MultiPoint"-Dokument und dann diese Abfrage:

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

Dies wird kein Ergebnis zurückgeben, und das auch nicht, weil "nicht alle" Punktkomponenten des Objekts innerhalb der Grenzen des in der Abfrage verwendeten Polygons liegen. Aber wenn Sie jeden Punkt als ein einzelnes Dokument betrachten:

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

Dann würden zwei der Punkte innerhalb des Polygons liegen. Da diese aber nicht als einzelne Dokumente, sondern als Teil eines „MutiPoint“ gespeichert werden, dann eben nicht alle Teile dieses Objekts in der Form enthalten sind, ist das Ergebnis falsch und das Dokument wird nicht zurückgegeben.

Dasselbe gilt hier für alle GeoJSON-Objekte, die im Wesentlichen eine Sammlung von "Punkten" in irgendeiner Darstellung enthalten.