by Marc-David Militz
Forum: MongoDB Theorie
use geospatial
db.restaurants.createIndex({location:"2dsphere"})
db.neighborhoods.createIndex({geometry:"2dsphere"})
db.restaurants.findOne()
db.neighborhoods.findOne()
Für die einzelnen Indexe gibt es unterschiedliche Abfragen, die möglich sind. Diese Abfragen können nur auf Geodaten angewendet werden, die auch mit einem geospatial Index versehen sind.
db.neighborhoods.findOne(
{ geometry:
{ $geoIntersects:
{ $geometry:
{ type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }
}
}
})
Was beim Thema Geokoordinaten auch immer ein spannender Anwendungsfall ist, sind Umkreissuchen.
In folgendem Beispiel wird "centerSphere" genutzt um alle Restaurants in einem bestimmten Radius zu finden.
db.restaurants.find(
{ location:
{ $geoWithin:
{ $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] }
}
})
Die Berechnung von "5 / 3963.2" ermittelt den sog. "Radius im Bogenmaß". Die Zahl 5 ist hier der Abstand in Meilen, in dem gesucht werden soll.
Die Zahl 3963.2 ist der Radius der Erde in Meilen. Der Radius im Bogenmaß berücksichtigt auch die Erdkrümmung.
Im letzten Beispiel suchen wir wieder Restaurants, diesmal sortieren wir das Ergebnis aber nach Entfernung. Damit sollte uns das am näcxhsten löigende Retaurant als erstes angezeigt werden.
var METERS_PER_MILE = 1609.34
db.restaurants.find(
{ location:
{ $nearSphere:
{ $geometry:
{ type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE
}
}
})
Der "Point" bestimmt unseren Standort, die Funktion "maxDistance" errechnet welche Restaurants sich innerhalb des gewünschten Radius befinden.
Wem das nicht genug ist, für den bietet Qualiero ein entsprechendes Classroom Training für MongoDB Entwickler an
https://www.qualiero.com/lerninhalte/classroom-trainings/mongodb-datenbank-entwickler-kurs.html