syy*_*mza 6 mongoose mongodb node.js
Mongoose版本:3.6节点版本:0.10
我一直试图解决这个问题几个小时.我想找到比maxDistance更接近某些坐标的所有文档.我正在尝试使用MongoDB(2dsphere)的GeoJSON规范,这样我就可以以米为单位输入距离.
这是我的架构"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);
Run Code Online (Sandbox Code Playgroud)
这是我插入查询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);
});
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我收到错误:
"错误#101:CastError:对于路径\"geo \"中的值\"[object Object] \",转换为数字失败
如果我改为修改此行:
$near: lonLat,
Run Code Online (Sandbox Code Playgroud)
同
$near: geo,
Run Code Online (Sandbox Code Playgroud)
我正确地得到了文件,但是,我不能用米作为计量单位.我的假设基于下表:http://docs.mongodb.org/manual/reference/operator/query-geospatial/
我已经看到很多使用$ geometry的功能示例,但没有使用$ near.我究竟做错了什么?
我必须使用该Mixed类型并添加一些自定义验证以确保值是数组且长度为 2。我还检查了空数组并将它们转换为nulls,因为在使用稀疏索引时需要这样做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();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5416 次 |
| 最近记录: |