【问题标题】:MongoDB geoNear not working for some coordinates but working for othersMongoDB geoNear 不适用于某些坐标但适用于其他坐标
【发布时间】:2021-03-13 07:57:00
【问题描述】:

我正在使用 MongoDB 和用于 mongoDB 的 Node.js 驱动程序开发 API。其中一条路线接收坐标并调用聚合管道,该管道返回按接近度和许多其他因素排序的结果。流水线第一步的代码是:

{$geoNear:{
  near:{
     type: "Point",
     coordinates: [lat, long]
  },
  spherical:true,
  distanceField:"distance"
}},

这一直很好,直到突然之间,它不是。现在它适用于某些坐标,而对于其他坐标则给出错误MongoError: invalid argument in geo near query: type。它适用于{lat:0, long:0},适用于{lat:40.7411, long:-73.9897},适用于{lat:46.68758191106798, long:2.8106467331441767},但适用于{lat:37.785834, long:-122.406417}{lat:47.643628614308675, long:-122.34560056016635} 时会出现错误。我能找到的唯一模式是它讨厌西海岸的坐标。我已经验证了 2d-sphere 索引仍然存在于数据中。我试过将球形设置为假。我什至尝试删除所有数据,即使使用空集合仍然会得到相同的行为。我真的很困惑为什么 geonear 的论点对某些观点有效,而对另一些观点无效。

编辑:我现在已经注释掉了除了以下代码之外的所有内容,我仍然得到相同的行为,其中一些坐标有效,而其他坐标为 MongoError: invalid argument in geo near query: type

router.post("/", asyncHandler(async (req, res, next) => {
    const {lat, long} = req.body;
    const errors = [];
    if(typeof(lat) !== "number" || Math.abs(lat) > 90) errors.push("Lat is invalid");
    if(typeof(long) !== "number" || Math.abs(long) > 180) errors.push("Long is invalid");
    if(errors.length) return next(errors);
    const feed = await req.app.locals.db.collection("posts").aggregate(
        [
            {$geoNear:{
                near:{
                    type: "Point",
                    coordinates: [lat, long]
                },
                spherical:true,
                distanceField:"distance"
            }},
        ]
    );
    const feedArr = await feed.toArray();
    res.json(feedArr);
}));

【问题讨论】:

    标签: node.js mongodb express aggregation-framework geonear


    【解决方案1】:

    GeoJSON Objects:

    如果指定经纬度坐标,则先列出经度,再列出纬度

    你做了coordinates: [lat, long]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多