MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy Mongo $near zwróci dokumenty, których dowolny punkt w MultiPoint znajduje się w zasięgu?

Sprawa na „blisko”

Rozważana odległość zawsze będzie od „najbliższego” punktu dowolnego przechowywanego obiektu GeoJSON. To samo dotyczy Polygon lub MultiPolygon i tak naprawdę wszystkich obiektów GeoJSON, które są ważne do przechowywania.

Rozważ to:

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

A jeśli użyjemy agregacji $geoNear jako sposób na pokazanie nam odległości od danej lokalizacji:

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

To mówi nam, że odległość jest uważana za 824 metry.

Teraz, jeśli uznasz każdy „punkt” za własny dokument w kolekcji i uruchomisz ten sam proces zapytania:

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

Następnie widzisz różne odległości każdego punktu od punktu początkowego jest zapytaniem, gdzie w pierwszym przypadku tylko "najbliższy" był faktycznie brany pod uwagę dla całego obiektu.

Mamy więc dowód, że odległość brana pod uwagę z $near /$geoNear lub jest zawsze tylko najbliższy punkt źródła użytego w zapytaniu.

Sprawa na $geoWithin

$geoWithin operacja jest jednak inna. Rozważ oryginalny dokument „MultiPoint”, a następnie to zapytanie:

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

Nie zwróci to żadnego wyniku i nie zwróci, ponieważ "nie wszystkie" składniki Point obiektu Object leżą w granicach tge Polygon użytego w zapytaniu. Ale jeśli potraktowałeś każdy punkt jako pojedynczy dokument:

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

Wtedy dwa z tych punktów byłyby widoczne wewnątrz wielokąta. Ale ponieważ nie są one przechowywane jako pojedyncze dokumenty, ale jako część „MutiPoint”, to chyba że wszystkie części tego obiektu są zawarte w kształcie, wynik jest fałszywy, a dokument nie jest zwracany.

To samo dotyczy wszystkich obiektów GeoJSON, które zasadniczo zawierają kolekcję „Point” w jakiejś reprezentacji.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. jak używać mongoDB jako wyszukiwarki?

  2. Jak mogę uporządkować moją aplikację ekspresową, w której wystarczy otworzyć połączenie mongodb tylko raz?

  3. menu mean.js nie działa Publicznie

  4. Mongoose zawsze zwraca pustą tablicę NodeJS

  5. Jak używać operatorów agregacji w $match w MongoDB (na przykład $rok lub $dayOfMonth)?