存储" findOne"的价值并使用" find"插入返回的值;在猫鼬

时间:2016-04-30 13:09:49

标签: node.js mongodb asynchronous mongoose

我正在尝试将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

但是,我不确定这是否是最佳的。

1 个答案:

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