2017-09-29 1 views
0

Newbie Frage und Verwirrung, wie ich Hapi/Mongoose/Mongo zu lernen versuchen.GeoJSON/Mungo-Geojson-Schema/Intro Verwirrung

mich Beauftragt mit dem Wunsch, ein Modell/Objekt einfach erstellen, die Text und einem Geolocation Point (lat & lon) enthält und können diese Objekte aus der DB mit einem gelieferten Strom lat & lon

Der Versuch, ein Abrufen zu erstellen Schema mit Mungo-GeoJSON-Schema Paket

"mongoose": "^4.11.1", "mongoose-geojson-schema": "^2.1.2"

Modell:

const GeoJSON = require('mongoose-geojson-schema'); 
const mongoose = require('mongoose'); 

const Schema = mongoose.Schema; 
const Point = mongoose.Schema.Types.Point 

const postModel = new Schema({ 
    _owner: { type: String, ref: 'User' }, 
    text: { type: String }, 
    loc: Point 
}); 

Beitrag erstellen:

let post = new Post(); 
post._owner = req.payload.user_id; 
post.text = req.payload.text; 

var point = new GeoJSON({ 
    point: { 
    type: "Point", 
    coordinates: [req.payload.lat, req.payload.lon] 
    } 
}) 
post.loc = point 

Halten Sie den Fehler GeoJSON is not a constructor in den Protokollen zu bekommen. Versuchte verschiedene Varianten und habe andere Fehler wie loc: Cast to Point failed for value "{ type: 'Point', coordinates: [ '39.0525909', '-94.5924078' ] }" at path "loc"

Antwort

1

Ich habe das Mungo-Geojson-Schema-Paket ein Ärgernis zu verwenden. Wenn Sie nur einen Punkt speichern, ändern Sie Ihr Modell wie folgt:

Als nächstes speichern Sie Ihre Koordinaten rückwärts. Obwohl wir normalerweise an lat/lon denken, denken wir in der GIS-Welt an lon/lat. GeoJson ist nicht anders. Denken Sie daran in x/y-Begriffen und es wird Sinn machen. So Ihre Kreation ändern:

post.loc = { 
    type: 'Point', 
    coordinates: [req.payload.lon, req.payload.lat] 
} 

An dieser Stelle ist es richtig in Mongo gespeichert werden, aber es wird nicht viel nützen, weil Sie nicht in der Lage sein wird, auf sie alle mathematischen zu suchen oder zu tun. Das letzte, was Sie tun müssen, ist einen 2Dsphere-Index hinzuzufügen.

postModel.index({'loc': '2dsphere'}); 

Jetzt sollten Sie gut gehen. Sie können Beiträge innerhalb einer gegebenen Entfernung von einem Punkt finden:

postModel.find({ 
    loc:{ 
    $geoWithin: { $centerSphere: [ [ -105.42559,36.55685 ], 10 ] } 
    } 
}).exec() 
+0

Danke, ich endete auch auf diese Weise! – ndyr