javamongodb"geoNear"命令return异常错误17304
java mongodb "geoNear" command return exception error 17304
我正在使用 mongoDB 在 java 应用程序中存储和获取与位置相关的信息。
我在使用 "geoNear" 获取数据时出现异常...
这是存储数据的代码:
Document doc = new Document(Params.pubId, UUID.fromString(tmsg.pubId))
.append(Params.location, new Point(new Position(tloc.lat, tloc.lon)))
.append(Params.locId, UUID.fromString(tloc.id))
.append(Params.pubTime, tmsg.pubTime)
.append(Params.span, tmsg.span)
.append(Params.messageId, UUID.fromString(tmsg.id))
.append(Params.header, tmsg.header)
.append(Params.senderId, UUID.fromString(tmsg.senderId))
.append(Params.senderDisp, tmsg.name)
.append(Params.homes, homes)
.append(Params.tags, tags);
collection.insertOne(doc);
这是获取
的代码
Document command = new Document("geoNear",Params.collection).append("near", new Point(new Position(loc.lat, loc.lon)))
.append("spherical", true)
.append("limit", Params.limit)
.append("maxDistance", plan.range)
.append("distanceMultiplier", Params.multplierKm);
//the "geoNear" will always return a non-null object
Document geoNear = database.runCommand(command);
并打印出异常
com.mongodb.MongoCommandException: Command failed with error 17304: ''near' field must be point' on server data.gubnoi.com:27017. The full response is { "ok" : 0.0, "errmsg" : "'near' field must be point", "code" : 17304, "codeName" : "Location17304" }
这个异常的发生是依赖的,有点奇怪
在成功案例中,我使用了模拟坐标0.0,0.0;我确实事先在这个坐标上存储了一些数据。正如我所说操作成功,我可以成功获取存储的数据。
在失败的情况下,我输入移动端获取的真实坐标,例如
lat:39.904522 lon: 116.65588
另外,事先没有数据存储在该位置。然后下面的语句失败,异常
Document geoNear = database.runCommand(command);
我在 Java 8 和 mongodb 3.4.1
下使用 mongo-java-driver 3.4.1
请指教
谢谢
I used mocked coordinates of 0.0, 0.0; and I did store some data on this coordinates beforehand. as I said the operation was success.
尝试颠倒坐标值的顺序; MongoDB 坐标顺序为 longitude
然后 latitude
。例如:
new Point(new Position(loc.lon, loc.lat))
它适用于 0.0
、0.0
,因为这两个值在反向时都有效(即无法识别为纬度或经度)。
您也可以使用 mongo shell 重现此错误:
> db.runCommand({geoNear: "places",
near: { type: "Point",
coordinates: [ 39.904522, 116.65588 ]
},
spherical: true
});
{
"ok": 0,
"errmsg": "'near' field must be point",
"code": 17304,
"codeName": "Location17304"
}
我正在使用 mongoDB 在 java 应用程序中存储和获取与位置相关的信息。
我在使用 "geoNear" 获取数据时出现异常...
这是存储数据的代码:
Document doc = new Document(Params.pubId, UUID.fromString(tmsg.pubId))
.append(Params.location, new Point(new Position(tloc.lat, tloc.lon)))
.append(Params.locId, UUID.fromString(tloc.id))
.append(Params.pubTime, tmsg.pubTime)
.append(Params.span, tmsg.span)
.append(Params.messageId, UUID.fromString(tmsg.id))
.append(Params.header, tmsg.header)
.append(Params.senderId, UUID.fromString(tmsg.senderId))
.append(Params.senderDisp, tmsg.name)
.append(Params.homes, homes)
.append(Params.tags, tags);
collection.insertOne(doc);
这是获取
的代码Document command = new Document("geoNear",Params.collection).append("near", new Point(new Position(loc.lat, loc.lon)))
.append("spherical", true)
.append("limit", Params.limit)
.append("maxDistance", plan.range)
.append("distanceMultiplier", Params.multplierKm);
//the "geoNear" will always return a non-null object
Document geoNear = database.runCommand(command);
并打印出异常
com.mongodb.MongoCommandException: Command failed with error 17304: ''near' field must be point' on server data.gubnoi.com:27017. The full response is { "ok" : 0.0, "errmsg" : "'near' field must be point", "code" : 17304, "codeName" : "Location17304" }
这个异常的发生是依赖的,有点奇怪
在成功案例中,我使用了模拟坐标0.0,0.0;我确实事先在这个坐标上存储了一些数据。正如我所说操作成功,我可以成功获取存储的数据。
在失败的情况下,我输入移动端获取的真实坐标,例如
lat:39.904522 lon: 116.65588
另外,事先没有数据存储在该位置。然后下面的语句失败,异常
Document geoNear = database.runCommand(command);
我在 Java 8 和 mongodb 3.4.1
下使用 mongo-java-driver 3.4.1请指教
谢谢
I used mocked coordinates of 0.0, 0.0; and I did store some data on this coordinates beforehand. as I said the operation was success.
尝试颠倒坐标值的顺序; MongoDB 坐标顺序为 longitude
然后 latitude
。例如:
new Point(new Position(loc.lon, loc.lat))
它适用于 0.0
、0.0
,因为这两个值在反向时都有效(即无法识别为纬度或经度)。
您也可以使用 mongo shell 重现此错误:
> db.runCommand({geoNear: "places",
near: { type: "Point",
coordinates: [ 39.904522, 116.65588 ]
},
spherical: true
});
{
"ok": 0,
"errmsg": "'near' field must be point",
"code": 17304,
"codeName": "Location17304"
}