我的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);
没有运气。
任何人都可以帮我吗?
提前致谢。
答案 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/