在Mongoose(NodeJS + MongoDB)中使用find()和地理空间坐标,

mongoose版本:3.6节点版本:0.10

我一直试图解决这个问题几个小时。 我想find比maxDistance更接近一些坐标的所有文件。 我正在尝试使用MongoDB(2dsphere)的GeoJSON规范,以便我可以input以米为单位的距离。

这是我的模式“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); 

这是我插入查询ctrlVenue.js的地方:

 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); }); } 

当我运行代码时,我收到错误:

“错误#101:CastError:在path\”geo \“”处投射数值失败\“[object Object] \”

如果我改为修改这一行:

 $near: lonLat, 

 $near: geo, 

我正确地得到文件,但是,我不能用米作为度量单位。 我基于我的假设在下表: http : //docs.mongodb.org/manual/reference/operator/query-geospatial/

我已经看到很多使用$几何的正在运行的例子,但没有一起使用$ near 。 我究竟做错了什么?

我不得不使用Mixedtypes,并添加了一些自定义validation,以确保值是数组,并且长度为2.我还检查了空数组,并将它们转换为null s,因为在使用2dsphere使用稀疏索引时2dsphere 。 (Mongoose有用地将数组字段设置为[],这不是一个有效的坐标!)

 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(); });