我正在使用express和mongoose构建一个api。我有一个Reviews集合,该集合具有一个存储geoJSON的位置字段。我正在尝试使用,合计 $ geoNear 来查询我的评论集合。

这是我的ReviewSchema的相关部分:

location: {
    type: {
      type: String,
      default: 'Point'
    },
    coordinates: {
      type: [Number]
    }
  }

我还添加了一个 2dsphere 索引:
ReviewSchema.index({ location: '2dsphere' });

我可以使用查找 $ nearSphere 成功查询集合:
router.get('/:longitude/:latitude/:dist', (req, res) => {
  Review.find({
    location: {
     $nearSphere: {
       $geometry: {
         type: 'Point',
         coordinates: [req.params.longitude, req.params.latitude]
       },
       $maxDistance: req.params.dist * 1609.34
     }
   }
  })
  .then(reviews => res.json(reviews))
});

当尝试使用aggregate和$ geoNear时,我得到一个错误:
'附近的字段必须为点'
这是带有查询的路线:
router.get('/:longitude/:latitude', (req, res) => {
  Review.aggregate([{
     $geoNear: {
       near: {
         type: "Point",
         coordinates: [req.params.longitude, req.params.latitude]
       },
       spherical: true,
       maxDistance: 10 * 1609,
       distanceField: 'distance'
     }
   }])
   .then(reviews => res.json(reviews))
   .catch(err => console.log(err))
});

我查询的语法基于$ geoNear的mongoDB文档。我在 Mongoose 上使用不正确吗?任何帮助,我们都感激不尽!

最佳答案

问题在于坐标始终应该是数字,而您将其放置为String
所以改为将它们转换为整数或浮点值

Review.aggregate([{
  "$geoNear": {
    "near": {
      "type": "Point",
      "coordinates": [parseFloat(req.params.longitude), parseFloat(req.params.latitude)]
    },
    "spherical": true,
    "maxDistance": 10 * 1609,
    "distanceField": "distance"
  }
}])

关于node.js - 近场必须是点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54507357/

10-11 06:11