MongoDB ofrece varios índices y mecanismos de query para gestionar información geoespacial. Esta sección demuestra cómo crear y usar índices geoespaciales con el driver Ruby.
Los ejemplos en esta página utilizan una colección de muestra denominada
restaurants en la base de datos de test. Un conjunto de datos de muestra está disponible para su descarga.
El siguiente es un documento de muestra de la colección restaurants:
{ "address": { "building": "1007", "coord": [ -73.856077, 40.848447 ], "street": "Morris Park Ave", "zipcode": "10462" }, "borough": "Bronx", "cuisine": "Bakery", "grades": [ { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 }, { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 } ], "name": "Morris Park Bake Shop", "restaurant_id": "30075445" }
El siguiente ejemplo crea un índice 2dsphere en el campo address.coord:
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test' ) client[:restaurants].indexes.create_one( { 'address.coord' => '2dsphere' })
Una vez creado el índice, puedes usar varios operadores para consultarlo, incluidos los operadores $near, $geoWithin, y $geoIntersects. El siguiente ejemplo utiliza el operador $near para encontrar todos los restaurantes dentro de 500 metros de las coordenadas especificadas.
client = Mongo::Client.new('mongodb://127.0.0.1:27017/test') collection = client[:restaurants] collection.find( { 'address.coord' => { "$near" => { "$geometry" => { "type" => "Point", "coordinates" => [ -73.96, 40.78 ] }, "$maxDistance" => 500 } } } ).each do |doc| #=> Yields a BSON::Document. end
Para encontrar todos los documentos con una ubicación dentro del perímetro de un polígono dado, utilice el operador $geoWithin :
client = Mongo::Client.new('mongodb://127.0.0.1:27017/test') collection = client[:restaurants] collection.find( { "address.coord" => { "$geoWithin" => { "$geometry" => { "type" => "Polygon" , "coordinates" => [ [ [ -73, 40 ], [ -74, 41 ], [ -72, 39 ], [ -73, 40 ] ] ] } } } } ).each do |doc| #=> Yields a BSON::Document. end