MongoDB ofrece diversos índices y mecanismos de consulta para gestionar información geoespacial. Esta sección muestra cómo crear y usar índices geoespaciales con el controlador Ruby.
Los ejemplos de esta página utilizan una colección de muestras denominada
restaurants en la test base de datos.Hay un conjunto de datos de muestra disponible para descargar.
El siguiente es un documento de muestra en 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, puede usar varios operadores para realizar consultas, como $near, $geoWithin y $geoIntersects. El siguiente ejemplo usa el $near operador para encontrar todos los restaurantes a 500 metros de las coordenadas dadas.
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 determinado, 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