2013-07-11 18 views
6

Mongoose Wersja: 3.6 wersja węzła: 0,10Korzystanie find() z współrzędnych geoprzestrzennych w Mongoose (NodeJS + MongoDB)

I zostały próbuje rozwiązać ten problem przez kilka godzin. Chcę znaleźć wszystkie dokumenty bliżej niż maxDistance dla niektórych współrzędnych. Próbuję użyć specyfikacji GeoJSON dla MongoDB (2dsphere), dzięki czemu mogę wprowadzić odległość w metrach.

To jest mój schemat "venue.js":

var db = require('mongoose'), 
    Schema = db.Schema, 
    ObjectId = Schema.ObjectId; 

var venueSchema = new Schema({ 
    geo: { type: [Number], index: '2dsphere'}, 
    city: String, 
    name: String, 
    address: String 
}); 


module.exports = db.model('Venue', venueSchema); 

To gdzie ja włożyć ctrlVenue.js zapytanie:

var Venue = require('../models/venue.js'); 


VenueController = function(){}; 

/** GET venues list ordered by the distance from a "geo" parameter. Endpoint: /venues 
    Params: 
     - geo: center for the list of venues - longitude, latitude (default: 25.466667,65.016667 - Oulu); 
     - maxDistance: maxímum distance from the center for the list of venues (default: 0.09) 
**/ 
exports.getVenues =function(req, res) { 

    var maxDistance = typeof req.params.maxDistance !== 'undefined' ? req.params.maxDistance : 0.09; //TODO: validate 
    var geo = typeof req.params.geo !== 'undefined' ? req.params.geo.split(',') : new Array(25.466667, 65.016667); //TODO: validate 

    var lonLat = { $geometry : { type : "Point" , coordinates : geo } }; 


    Venue.find({ geo: { 
     $near: lonLat, 
     $maxDistance: maxDistance 
    }}).exec(function(err,venues){ 
     if (err) 
      res.send(500, 'Error #101: '+err); 
     else 
      res.send(venues); 
     }); 
    } 

Kiedy uruchomić kod otrzymuję błąd:

"Error #101: CastError: Cast to number failed for value \"[object Object]\" at path \"geo\""

Gdybym zamiast modyfikować tę linię:

$near: lonLat, 

z

$near: geo, 

I prawidłowo uzyskać dokumenty, ale nie mogę wykorzystać metrów jako jednostki miary. oparłem moje założenia dotyczące poniższej tabeli: http://docs.mongodb.org/manual/reference/operator/query-geospatial/

widziałem mnóstwo przykładów funkcjonowania korzystających $ geometrię ale żaden wraz z $ najbliższej. Co ja robię źle?

+0

Hmm, zapytanie jest zbudować poprawnie, ale nie jestem pewien, dlaczego mangusta rzuca dopasowanie! – Derick

+1

@Derick to, co myślałem. I ten rodzaj użytkowania wydaje mi się tak podstawowy, że byłbym bardzo zaskoczony, gdybym tylko ja to przeżyłem ... – syymza

Odpowiedz

3

miałem użyć typu Mixed i dodano kilka niestandardowy walidacji do zapewnienia wartości te tablice i miała długość 2. również sprawdzone pustych tablic i przekształca je do null dlatego, że jest to konieczne przy użyciu wskaźników rzadkich z 2dsphere . (Mongoose usłużnie ustawia pola do tablicy [] za ciebie, co nie jest prawidłowym koordynować!)

var schema = new mongoose.Schema({ 
    location: { type: {}, index: '2dsphere', sparse: true } 
}); 

schema.pre('save', function (next) { 
    var value = that.get('location'); 

    if (value === null) return next(); 
    if (value === undefined) return next(); 
    if (!Array.isArray(value)) return next(new Error('Coordinates must be an array')); 
    if (value.length === 0) return that.set(path, undefined); 
    if (value.length !== 2) return next(new Error('Coordinates should be of length 2')) 

    next(); 
}); 
+0

Cześć panie, wydajesz się być dobrze przygotowany w tego rodzaju sprawach. Czy mógłbyś rzucić okiem na moje otwarte pytanie o nagrodę +50: http://stackoverflow.com/questions/37733030/finding-closest-points-to-a-certain-point-given-its-coordinates-and-maximum- dist? – AndreaM16

Powiązane problemy