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

Vil en Mongo $nær returnere dokumenter, for hvilke ethvert punkt i et MultiPoint er inden for rækkevidde?

Tag for "nær"

Den betragtede afstand vil altid være fra det "nærmeste" punkt på ethvert gemt GeoJSON-objekt. Det samme gælder for Polygon eller MultiPolygon og egentlig alle GeoJSON-objekter, der er gyldige til opbevaring.

Overvej dette:

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

Og hvis vi bruger aggregering $geoNear som et middel til at vise os afstanden fra et givet sted:

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

Dette fortæller os, at afstanden anses for at være 824 meter.

Hvis du nu betragtede hvert "Punkt" som dets eget dokument i stedet i samlingen og kørte den samme forespørgselsproces:

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

Så ser du de forskellige afstande for hvert punkt fra udgangspunktet er forespørgslen, hvor i førstnævnte tilfælde kun det "nærmeste" faktisk blev taget i betragtning for hele objektet.

Så der er beviset for, at afstanden betragtet med $near /$geoNear eller er altid kun det nærmeste punkt til den oprindelse, der blev brugt i forespørgslen.

Case for $geoWithin

$geoWithin driften er dog anderledes. Overvej det originale "MultiPoint"-dokument og derefter denne forespørgsel:

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

Dette vil ikke returnere noget resultat, og det vil det ikke, fordi "ikke alle" punktkomponenter i objektet ligger inden for grænserne af den polygon, der bruges i forespørgslen. Men hvis du betragtede hvert punkt som et enkelt dokument:

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

Så ville to af punkterne ses at være inde i polygonen. Men da disse ikke er gemt som individuelle dokumenter, men som en del af et "MutiPoint", så medmindre alle dele af det objekt er indeholdt i formen, så er resultatet falsk, og dokumentet returneres ikke.

Det samme gælder her for alle GeoJSON-objekter, der i det væsentlige indeholder en samling af "Point" i en eller anden repræsentation.




  1. Kan ikke starte MongoDB:Systemfejl 1067 i Windows

  2. MongoDB forbinder data inde i en række objekter

  3. Sådan udtrækkes tidsstempel fra mongodb objectid i postgres

  4. `felter kan ikke være identiske:' ' og ' '` mongoimport fejl