我正在尝试将MongoDB GeoSpatial query转换为猫鼬,但我没有运气。 MongoDB查询如下所示:
var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } } )
然后在邻居的$geometry
查询中插入邻域的值。
db.restaurants.find( { location: { $geoWithin: { $geometry: neighborhood.geometry } } } )
然后你将获得附近的所有餐馆。
所以,我提出的是以下使用Mongoose和Express,这显然是错误的,只是我对MongoDB查询的翻译。
exports.getRestaurantInNeighborhood = function(req, res, next) {
var geojsonPoint = {type: 'Point', coordinates: [-73.93414657, 40.82302903]};
var neighborhood = Neighborhood.findOne({geometry: {$geoIntersects: {$geometry: geojsonPoint}}})
Restaurant.find({location: { $geoWithin: { $geometry: neighborhood.geometry } } } )
.then(function(data) {
res.json(data);
}, function(err) {
next(err);
});
}
我认为它无法正常工作,因为在neighborhood
返回数据时我没有得到Restaurant
的值,这会给我一个错误,即没有{{ 1}} geometry
中的对象。因此,neighborhood
没有任何回报。
感谢您解决此问题的任何帮助。
更新
我提出的有效的方法如下:
neighborhood
但是,我不确定这是否是最佳的。
答案 0 :(得分:0)
要扩展您的更新,不需要为每个承诺指定拒绝处理程序,您不应该这样做。只需正确地链接您的承诺并在最后处理错误。任何错误都会通过整个链传播到catch()块。
exports.getRestaurantInNeighborhood = function (req, res, next) {
var geojsonPoint = {
type: 'Point',
coordinates: [-73.93414657, 40.82302903]
};
return Neighborhood
.findOne({
geometry: {
$geoIntersects: {
$geometry: geojsonPoint
}
}
})
.then(function (data) {
// Make sure there is a return.
return Restaurant.find({
location: {
$geoWithin: {
$geometry: data.geometry
}
}
});
})
.then(function (data) {
// This gets called if there are no errors.
res.json(data);
})
.catch(function (err) {
// Here you handle errors. or you can call next(err) and
// handle it in a middleware.
console.warn(err);
});
}