Sails.js-ek (node.js-en oinarritutako web frameworka) Waterline darabil datubaseekin komunikatzeko.

Waterline-eri hainbat egokitzaile gehitu diezazkiokegu, beste hainbeste datubaserekin lan egiteko: PostgreSQL, MySQL, MongoDB… API bakarrarekin datubase ezerdinetan dauden datu modeloekin lan egiteko aukera ematen digu, beraz, Sails.js-ek. Dena den, API hau mugatua da. Metodo orokorrak eskeintzen dizkigunez ez da datubase bakoitzaren berezitasunetaz ohartzen.

Oraingoan kasu berezi hauetako bat degu eskutartean, Waterline-ek ulertzen ez dituen MongoDB-ren geo-kontsultak erabili nahi bait ditut. Kasu hauetarako Waterline-ek zuzenean datubasearekin hitzegiteko aukera ematen digu native eta query izeneko modeloen metodoak erabiliz. Informazioa Sails.js 0.10 bertsioaren dokumentazioan (beta momentu hauetan) topatu daiteke, nahiz eta 0.9 bertsio egonkorrean ere erabilgarri izan (0.9.8 frogatu det nik). MongoDB-ren kasuan native erabiliko degu.

.native()

Purpose

Returns an instance of the specified collection for performing raw Mongo queries.
Esan eta egin, gure kontroladoreren (adibidez) batean darabilkigun modeloaren native() metodoa erabili ahal izango degu, metodo honek jatorrizko bilduma itzuliko digu MongoDB kontsulta gordinak egin diezazkiogun.

Modeloa.native(function(err, collection){
// collections-i MongoDB kontsulta gordinak egin
// …
})

Orain datubaseari geo-kontsultak egin diezazkiokegu, baina lehenengo datubasean geo-indizea sortu behar degu bilaketak egin ahal izateko!

Horretarako datubasean sartu beharko gera eta behar den bildumari [ensureIndex()](http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/#db.collection.ensureIndex) egingo diogu, gure puntu geografikoen modeloaren giltza (key) eta indize mota ezarriaz.

Hona hemen nere puntuen datu modeloa:

module.exports = {
attributes: {
loc: {
type:”STRING”,
coordinates: [“FLOAT”]
}
}
};

Modelo hontan loc _giltza_pean GeoJSON oso xinple bat definitu degu, type “Point” testu katea (hala definitu degu) izango da eta coordinates koordenatuak, float matrize bat definitu degu koordenatuak [34.45626, -1.8324534] erakoak direlako.

Gauzak horrela MongoDB kontsola bidez honakoa exekutatu behar degu points bildumaren loc giltzarekin [2dsphere](http://docs.mongodb.org/manual/core/2dsphere/) (indize geoespazial hobetua) indize bat sortzeko:

db.points.ensureIndex( { “loc”: “2dsphere” } )

MongoDb-ek indizea sortu duela esango digu eta dagoeneko geo-kontsultak egiteko prest gaude!

Aukera ugari daude datu geoespazalekin jolasteko, MongoDB-ren dokumentazioan hasi zaitezkete begiratzen, nik eredutxo bat jarriko det.

module.exports = {
inguruan: function(req,res){
// GET deitik bilaketa parametroak hartu
// lat: latitudea
// lon: longitudea
// radius: bilaketaren radioa
var lat = req.query.latitude,
lon = req.query.longitude,
radius = req.query.radius;

    Point.native(function(err, collection){
        collection.find({
            loc : {
                // $nearSphere MongoDB-ren 2dsphere indizearen
                // bilaketa metodo bat da. Distantzia metrotan eskatzeko aukera ematen du!
                $nearSphere : {
                    $geometry : {
                        "type":"Point",
                        "coordinates": [lon, lat]
                    },
                    // radioa ez badute eskatu 5000m erabili
                    $maxDistance: radius || 5000
                }
            }
        })
        // toArray datubase kolekzioaren metodoa da kontsulta exekutatu
        // eta datuak itzultzeko.
        .toArray(function(err,points){
            // res.json haundia, GET deiari JSON eran erantzuten dio
            // datubasetik jaso berri ditugun datuekin
            res.json(points)
        })
    })
}

}
Points kontroladorean inguruan metodoa definitu degu, parametroak jarriaz GET dei bat egiten badiogu parametro horien baitako JSONa itzuliko du!

http://localhost:1337/points/inguruan?latitude=43.1242&longitude=-1.83266&radius=10000

Sails.js eta MongoDBren sarreratxoa besterik ez da, baina ea erabilgarria zaizuen! Galderak, iruzkinak etab lasai asko bidali!