sql >> Database >  >> NoSQL >> MongoDB

Zal een Mongo $bijna documenten retourneren waarvoor een punt in een MultiPoint binnen bereik is?

Geval voor "in de buurt"

De beschouwde afstand is altijd vanaf het "dichtstbijzijnde" punt van elk opgeslagen GeoJSON-object. Hetzelfde geldt voor Polygon, of MultiPolygon en eigenlijk alle GeoJSON-objecten die geldig zijn voor opslag.

Overweeg dit:

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

En als we aggregatie gebruiken $geoNear als een middel om ons de afstand vanaf een bepaalde locatie te tonen:

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

Dit vertelt ons dat de afstand wordt beschouwd als 824 meter.

Als u nu elk "punt" als zijn eigen document in de verzameling beschouwt en hetzelfde queryproces uitvoert:

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

Dan zie je de verschillende afstanden van elk punt vanaf het punt van oorsprong is de zoekopdracht, waarbij in het eerste geval alleen de "dichtstbijzijnde" voor het hele object in aanmerking werd genomen.

Dus er is het bewijs, dat de afstand beschouwd met $near /$geoNear of is altijd alleen het dichtstbijzijnde punt bij de oorsprong die in de zoekopdracht is gebruikt.

Case voor $geoWithin

De $geoWithin bediening is echter anders. Beschouw het originele "MultiPoint"-document en dan deze vraag:

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

Dit zal geen resultaat opleveren, en ook niet omdat "niet alle" Puntcomponenten van het Object binnen de grenzen van de in de query gebruikte Polygoon liggen. Maar als u elk punt als een enkel document beschouwt:

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

Dan zouden twee van de punten binnen de veelhoek liggen. Maar aangezien deze niet worden opgeslagen als individuele documenten maar als onderdeel van een "MutiPoint", dan tenzij alle delen van dat object zich in de vorm bevinden, dan is het resultaat onwaar en wordt het document niet geretourneerd.

Hetzelfde geldt hier voor alle GeoJSON-objecten die in wezen een verzameling "Punten" in een bepaalde weergave bevatten.




  1. Hoe maak je een afbeeldingsselectie met ejs en express?

  2. Breng grote MongoDB-verzamelingen over naar data.frame in R met rmongoDB en plyr

  3. nodejs mongodb-stuurprogramma verbreekt verbinding bij inactiviteit

  4. PII-maskering in MongoDB en andere NoSQL-DB's via ...