使用Java驱动程序的MongoDB$near查询

使用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

我的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驱动程序没有任何经验,但我觉得问题出在这方面

 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));