MongoDb 2.6.1错误:17444 - "遗留点超出了球形查询的范围"

时间:2014-06-30 06:39:59

标签: mongodb mongodb-.net-driver

在我的系统n中将MongoDb升级到2.6.1后,我偶尔会遇到以下错误:

  

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

ErrorCode 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.MongoReplyMessage 1.ReadFrom(BsonBuffer buffer, IBsonSerializationOptions serializationOptions) at MongoDB.Driver.Internal.MongoConnection.ReceiveMessage[TDocument](BsonBinaryReaderSettings readerSettings, IBsonSerializer serializer, IBsonSerializationOptions serializationOptions) at MongoDB.Driver.Operations.QueryOperation 1.GetFirstBatch(IConnectionProvider)   的ConnectionProvider)

1 个答案:

答案 0 :(得分:3)

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

问题是当调用传统坐标超出范围时,一些$ near查询会使MongoDB服务器崩溃。

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

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)