MongoDb 2.6.1 错误:17444 -“旧点超出球形查询的范围”

Posted

技术标签:

【中文标题】MongoDb 2.6.1 错误:17444 -“旧点超出球形查询的范围”【英文标题】:MongoDb 2.6.1 Error: 17444 - "Legacy point is out of bounds for spherical query" 【发布时间】:2014-06-30 06:39:59 【问题描述】:

在我的系统中将 MongoDb 升级到 2.6.1 后,有时会出现以下错误:

传统点超出球形查询的范围

错误代码 17444

这里:https://github.com/mongodb/mongo/blob/master/src/mongo/db/geo/geoquery.cpp#L73 我可以看到这是由 mongo db 由于一些无效数据引起的。

// The user-provided point can be flat.  We need to make sure that it's in bounds.
if (isNearSphere) 
    uassert(17444,
            "Legacy point is out of bounds for spherical query",
            centroid.flatUpgradedToSphere || (SPHERE == centroid.crs));

但目前我不知道为什么以及如何防止它。

我的代码如下所示:

IEnumerable<BsonValue> cids = companyIds.ToBsonValueArray();


    return Collection.Find(
                            Query.And(
                               Query.In("CompanyId", cids),
                               Query.Near("Location", location.Geography.Longitude, location.Geography.Latitude, location.Radius / 6371000, true))).ToList();

堆栈跟踪:

QueryFailure 标志是传统点超出球形范围 查询(响应为 “$err”:“遗留点超出范围 球形查询”,“代码”:17444 )。 在 MongoDB.Driver.Internal.MongoReplyMessage1.ReadFrom(BsonBuffer buffer, IBsonSerializationOptions serializationOptions) at MongoDB.Driver.Internal.MongoConnection.ReceiveMessage[TDocument](BsonBinaryReaderSettings readerSettings, IBsonSerializer serializer, IBsonSerializationOptions serializationOptions) at MongoDB.Driver.Operations.QueryOperation1.GetFirstBatch(IConnectionProvider 连接提供者)

【问题讨论】:

【参考方案1】:

您使用的是 MongoDB 2.6.1 或更高版本,因为您正在查看的代码是作为 JIRA-13666 问题的修复添加的。

问题是一些 $near 查询在使用超出范围的旧坐标调用时会导致 MongoDB 服务器崩溃。

您发送的坐标可能超出范围。使用最大距离进行 $near 查询时检查经度和纬度的代码部分(geoparser.cpp 中的GeoParser::parsePointWithMaxDistance 方法):

bool isValidLngLat(double lng, double lat) 
    return lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;

如果坐标超出范围,centroid.flatUpgradedToSphere 将为 false,这将导致您收到错误。

您应该将坐标更改为在范围内或将 spherical 参数设置为 false 以避免出现此错误。

Query.Near("Location", location.Geography.Longitude, 
           location.Geography.Latitude, location.Radius / 6371000, false)

【讨论】:

感谢您的回复。因此,如果我的理解正确,问题可能是他们的较长时间,而对 2.6.1 的更新只是因为该断言而揭示了它。对?我会检查我是否可以得到一些错误 szenarios 的日志,也许我以前在解析半径和/或坐标时遇到过错误 @BoasEnkler 我真的不知道这个问题是如何存在的,但在 JIRA 中受影响的版本是 2.6,所以我想这是一个“最近”引入的错误。 我的意思是我在计算坐标时可能出现了较长时间的错误,并且该错误仅在更新时才显示出来。 (如果我没听错的话) @BoasEnkler 对不起,我误解了你。我猜您的代码中的问题以前就存在,但直到现在 MongoDB 方面还没有针对该问题的保护措施。 “完美”。所以这是合乎逻辑的,因为我们有一个组件可能会不时地解决坐标问题

以上是关于MongoDb 2.6.1 错误:17444 -“旧点超出球形查询的范围”的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 2.6.1 与 Querydsl Mongodb 不兼容?

无法使用 Grails 3.1.1 连接到 mongo DB

mysql基础操作

连接错误:我是 Mongodb 的新手,现在在创建与节点 js 的连接到 mongodb atlas 显示以下错误时,我遇到了 mongodb 的问题

MongoDB - 错误:无效的架构,预期的 mongodb

MongoDB 错误:通过 JSON 文件以 ISO 格式将日期插入 MongoDB