sql >> Databasteknik >  >> NoSQL >> MongoDB

Kommer en Mongo $nära att returnera dokument för vilka någon punkt i en MultiPoint är inom räckhåll?

Val för "nära"

Avståndet som beaktas kommer alltid att vara från den "närmaste" punkten för alla lagrade GeoJSON-objekt. Detsamma gäller för Polygon, eller MultiPolygon och egentligen alla GeoJSON-objekt som är giltiga för lagring.

Tänk på detta:

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

Och om vi använder aggregering $geoNear som ett sätt att visa oss avståndet från en given plats:

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

Detta säger oss att avståndet anses vara 824 meter.

Om du nu betraktade varje "Point" som sitt eget dokument i samlingen istället och körde samma frågeprocess:

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

Sedan ser du de olika avstånden för varje punkt från utgångspunkten är frågan, där i det förra fallet bara det "närmaste" faktiskt beaktades för hela objektet.

Så det finns beviset på att avståndet betraktat med $near /$geoNear eller är alltid endast den närmaste punkten till ursprunget som används i frågan.

Case för $geoWithin

$geoWithin driften är dock annorlunda. Tänk på det ursprungliga "MultiPoint"-dokumentet och sedan denna fråga:

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

Detta kommer inte att returnera något resultat, och det kommer inte att göra det eftersom "inte alla" punktkomponenter i objektet ligger inom gränserna för den polygon som används i frågan. Men om du betraktade varje punkt som ett enda dokument:

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

Då skulle två av punkterna ses vara inne i polygonen. Men eftersom dessa inte lagras som enskilda dokument utan som en del av en "MutiPoint", såvida inte alla delar av det objektet finns i formen, då är resultatet falskt och dokumentet returneras inte.

Detsamma gäller här för alla GeoJSON-objekt som i huvudsak innehåller en samling "Point" i någon representation.




  1. Hur man lagrar array av hash i redis

  2. Hur skriver man ut mer än 20 objekt (dokument) i MongoDB:s skal?

  3. vad är pagecache, dentries, inoder?

  4. Hur löser jag denna designbegränsning i mongo db w.r.t till prestanda?