使用Java驱动程序的MongoDB$near查询
我的MongoDB中有一些商店的产品遵循以下数据模型: 商店 { idShop,名称,位置{lat,lon},int的产品[] } 如果在mongoDB默认控制台中运行以下命令: db.shops.find({产品:1,位置:{$near:[41.391204,2.145381]})。限制(300) 要查找按距离订购产品编号1的商店,我得到以下结果: {“_id”:ObjectId(“4f410cefe4b03a0e3cff6f5a”),“名称”:“店铺1”,“位置”:{“lat”:41.389915,“lon”:2.135628},“产品”:[1,5,4]} {u id:ObjectId(“4f410cefe4b03a0e3cff6f59”),“名称”:“购物中心”,“位置”:{“lat”:41.388191,“lon”:2.128816},“产品”:[1,2,3]} {“_id”:ObjectId(“4f410cefe4b03a0e3cff6f5c”),“名称”:“Shop3”,“位置”:{“lat”:41.384712,“lon”:2.172031},“产品”:[6,1]} {“_id”:ObjectId(“4f410cefe4b03a0e3cff6f5d”),“名称”:“店铺4”,“位置”:{“lat”:41.384029,“lon”:2.173936},“产品”:[6,1,2,3,4,5]} 现在,我想要相同的结果,但是使用我的Javaservlet。如果我只按产品编号搜索,结果可以,但没有排序。然后,如果我尝试通过添加新的键/值条件对它们进行排序,它不会返回任何结果。我使用的代码如下所示: BasicDBObject查询=新建BasicDBObject() put(“products”,Integer.parseInt(idProduct)) QueryBuilder query2=新QueryBuilder() query2.near(Double.parseDouble(lat),Double.parseDouble(lon)) query.putAll(query2.get()) curShops=collShops.find(查询) 这将返回一个空的JSON。我还尝试过其他方法,如: BasicDBObject查询=新建BasicDBObject() put(“products”,Integer.parseInt(idProduct)) ArrayList ar=新的ArrayList(2) ar.add(Double.parseDouble(lat)) ar.add(Double.parseDouble(lon)) put(“location”,新的BasicDBObject($near),ar)) curShops=collShops.find(查询) 没有任何运气 有人能帮我吗使用Java驱动程序的MongoDB$near查询,java,mongodb,Java,Mongodb,我的MongoDB中有一些商店的产品遵循以下数据模型: 商店 { idShop,名称,位置{lat,lon},int的产品[] } 如果在mongoDB默认控制台中运行以下命令: db.shops.find({产品:1,位置:{$near:[41.391204,2.145381]})。限制(300) 要查找按距离订购产品编号1的商店,我得到以下结果: {“_id”:ObjectId(“4f410cefe4b03a0e3cff6f5a”),“名称”:“店铺1”,“位置”:{“lat”:41.389
提前谢谢。我对java驱动程序没有任何经验,但我觉得问题出在这方面
query2.near(Double.parseDouble(lat), Double.parseDouble(lon));
根据文件
代码假定您使用的是十进制度数(经度,
(纬度)顺序。这与GeoJSON规范使用的顺序相同。
使用(纬度、经度)将导致非常不正确的结果,但是
订单通常在别处使用,因此最好仔细检查
也可以从,你可以看到,
近的
与$near操作数等价
参数:
x-x坐标
y-y坐标
x-坐标表示此处的经度。因此,位置坐标必须作为[lon,lat]
传递,而不是[lat,lon]
将您的查询更改为
query2.near(Double.parseDouble(lon), Double.parseDouble(lat));
要让它发挥作用是的,这很简单。我刚刚发布了一个示例,该示例将引导您了解解决方案,请参见
query2.near(Double.parseDouble(lon), Double.parseDouble(lat));