我在让GeoNear在SailsJS中工作时遇到了很多麻烦。
在我的UserController.js中,我试图在我的用户模型中的location
字段上进行geoNear查询。它被定义为带有2d索引的JSON。以下是该字段数据的示例:
"location" : { "type" : "Point" , "coordinates" : [ 42.8003 , -73.8808 ]}
在我的UserController中,我的geoSearch方法如下所示:
geoSearch: function(req, res) {
//sails.log.verbose(req);
var lat = req.param('lat');
var lng = req.param('long');
var limit = req.param('limit') || 50;
var maxDistance = req.param('radius') || 5000; //meters
sails.log.verbose('lat : ' + lat);
sails.log.verbose('lng : ' + lng);
sails.log.verbose('limit : ' + limit);
sails.log.verbose('maxDistance : ' + maxDistance);
if (!(lat && lng)) {
//bad stuff
res.badRequest('Missing lat or long!');
} else {
User.native(function(err, collection) {
collection.geoNear(lng, lat, {
limit: limit,
maxDistance: maxDistance, // in meters
query: {}, // allows filtering
distanceMultiplier: 3959, // converts radians to miles (use 6371 for km)
spherical : true
}, function(mongoErr, users) {
if (mongoErr) {
console.error(mongoErr);
res.send('_geoSearch failed with error='+mongoErr);
} else {
console.log('users=',users);
res.json(users.results);
}
});
});
}
}
但是,当我提出如下请求时:
http://localhost:1337/api/user/location/?lat=42.8003&long=-73.8808
我得到了输出:
verbose: lat : 42.8003
verbose: lng : -73.8808
verbose: limit : 50
verbose: maxDistance : 5000
{ [MongoError: exception: 'near' field must be point]
name: 'MongoError',
errmsg: 'exception: \'near\' field must be point',
code: 17304,
ok: 0 }
我一直在努力解决这个问题,任何帮助或指导都会受到赞赏。
其他信息:
MongoDB~3.0 SailsJS~0.10
答案 0 :(得分:2)
我遇到了同样的问题,原因是:
但是,当我提出如下请求时:
http://localhost:1337/api/user/location/?lat=42.8003&long=-73.8808
因此,当在服务器端接收数据时,它将转换为“String”。 试试这个来解决它:
var latitude = parseFloat(req.param('lat'));
var longitude = parseFloat(req.param('long'));
希望这会有所帮助。
答案 1 :(得分:1)
我遇到了类似的问题,直到我将其添加到我的bootstrap.js文件
module.exports.bootstrap = function(cb) {
// Ensure we have 2dsphere index on Property so GeoSpatial queries can work!
sails.models.stores.native(function (err, collection) {
collection.ensureIndex({ loc: '2dsphere' }, function () {
// It's very important to trigger this callack method when you are finished
// with the bootstrap! (otherwise your server will never lift, since it's waiting on the bootstrap)
cb();
});
});
};
基本上,您确保您的集合具有与之关联的2d球体键。最后在模型文件中不要忘记将包含地理坐标的键的类型定义为json,如下所示:
module.exports = {
attributes: {
loc: {
type: 'json'
}
}
};
希望它有所帮助。小心。