MongoDB geoNear 不适用于某些坐标但适用于其他坐标

问题描述

我正在使用 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} 时会出现错误。我能找到的唯一模式是它讨厌西海岸的坐标。我已经验证了二维球体索引仍然存在于数据中。我试过将球设置为假。我什至尝试删除所有数据,即使使用空集合仍然得到相同的行为。我真的很困惑为什么 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",long]
                },distanceField:"distance"
            }},]
    );
    const FeedArr = await Feed.toArray();
    res.json(FeedArr);
}));

解决方法

GeoJSON Objects

如果指定纬度和经度坐标,请先列出经度,然后再列出纬度

你做了coordinates: [lat,long]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...