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

时间:2012-02-19 18:42:05

标签: java mongodb

我的MongoDB数据库中有一些商店有产品,遵循以下数据模型:     店     {        idShop,名称,位置{lat,lon},int的产品[]     } 如果我在mongoDB默认控制台中运行以下命令:

  

db.shops.find({products:1,location:{$ near:[41.391204,2.145381]}})。limit(300)

找到按距离排序的第1号商品的商店我得到以下结果:

  

{“_ id”:ObjectId(“4f410cefe4b03a0e3cff6f5a”),“name”:“Shop1”,“location”:{“lat”:41.389915,“lon”:2.135628},“products”:[1,5, 4]}

     

{“_ id”:ObjectId(“4f410cefe4b03a0e3cff6f59”),“name”:“Shop2 Center”,“location”:{“lat”:41.388191,“lon”:2.128816},“产品”:[1,2 ,3]}

     

{“_ id”:ObjectId(“4f410cefe4b03a0e3cff6f5c”),“name”:“Shop3”,“location”:{“lat”:41.384712,“lon”:2.172031},“产品”:[6,1] }

     

{“_ id”:ObjectId(“4f410cefe4b03a0e3cff6f5d”),“name”:“Shop4”,“location”:{“lat”:41.384029,“lon”:2.173936},“products”:[6,1, 2,3,4,5]}

现在,我希望使用我的java servlet获得相同的结果。如果我仅搜索产品编号,则结果正常但未排序。然后,如果我尝试通过添加新的键/值条件对它们进行排序,则它不会返回任何内容。我正在使用的代码如下:

  

BasicDBObject query = new BasicDBObject();

     

query.put(“products”,Integer.parseInt(idProduct));

     

QueryBuilder query2 = new QueryBuilder();

     

query2.near(Double.parseDouble(lat),Double.parseDouble(lon));

     

query.putAll(query2.get());

     

curShops = collShops.find(query);

这将返回一个空的JSON。我也尝试过其他方式:

  

BasicDBObject query = new BasicDBObject();

     

query.put(“products”,Integer.parseInt(idProduct));

     

ArrayList ar = new ArrayList(2);

     

ar.add(Double.parseDouble(LAT));

     

ar.add(Double.parseDouble(LON));

     

query.put(“location”,new BasicDBObject(“$ near”,ar));

     

curShops = collShops.find(query);

没有运气。

任何人都可以帮我吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我对java驱动程序没有任何经验,但在我看来问题就出在这一行

 query2.near(Double.parseDouble(lat), Double.parseDouble(lon));

Accoridng to mongodb文档,

  

代码假定您使用的是十进制度数(经度,   纬度)订单。这与GeoJSON规范使用的顺序相同。   使用(纬度,经度)会导致非常不正确的结果,但是   通常是其他地方使用的排序,所以仔细检查

同样来自java mongodb-api-doc,您可以看到

public QueryBuilder near(double x,
                         double y)

$ near操作数的等效值

<强>参数:

x - x坐标

y - y坐标

x-cordinate在这里表示经度。因此,位置坐标必须以[lon,lat]而不是[lat,lon]

传递

将您的查询更改为

 query2.near(Double.parseDouble(lon), Double.parseDouble(lat));

让它发挥作用

答案 1 :(得分:0)

是的,这很简单。我刚刚发布了一个示例,可以引导您完成http://chuckjohnson.wordpress.com/处的解决方案 - 请参阅http://chuckjohnson.wordpress.com/2012/04/02/geospatial-location-based-searches-in-mongodb-part-2-simple-searching/