$near$展开mongodb地理空间
我有一份教育机构文件,如下所示:$near$展开mongodb地理空间,mongodb,geolocation,geospatial,mongodb-java,Mongodb,Geolocation,Geospatial,Mongodb Java,我有一份教育机构文件,如下所示: public BasicDBList findByCoordinates(double latitude, double longitude){ BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution"); List<BasicDBObject> pipeline = new ArrayList<BasicDBObject&
public BasicDBList findByCoordinates(double latitude, double longitude){
BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");
List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();
BasicDBObject projectParams = new BasicDBObject();
projectParams.put("name", 1);
projectParams.put("addresses.state", 1);
projectParams.put("addresses.locs", 1);
projectParams.put("courses", 1);
BasicDBObject geoParams = new BasicDBObject();
geoParams.put("$near", new double[] { latitude, longitude });
geoParams.put("$maxDistance", 50/111.12);
pipeline.add(new BasicDBObject("$project", projectParams));
pipeline.add(new BasicDBObject("$unwind", "$addresses"));
cmdBody.put("pipeline", pipeline);
cmdBody.put("$addresses.locs", geoParams);
return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}
{名称:…,地址:[{州:…,地点:[]},],课程:[…]}
locs是我的地理空间点所在的位置
要执行$near
命令,我需要$unwind
地址,因为我可以在许多地方拥有一个教育机构
我当前的方法如下所示:
public BasicDBList findByCoordinates(double latitude, double longitude){
BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");
List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();
BasicDBObject projectParams = new BasicDBObject();
projectParams.put("name", 1);
projectParams.put("addresses.state", 1);
projectParams.put("addresses.locs", 1);
projectParams.put("courses", 1);
BasicDBObject geoParams = new BasicDBObject();
geoParams.put("$near", new double[] { latitude, longitude });
geoParams.put("$maxDistance", 50/111.12);
pipeline.add(new BasicDBObject("$project", projectParams));
pipeline.add(new BasicDBObject("$unwind", "$addresses"));
cmdBody.put("pipeline", pipeline);
cmdBody.put("$addresses.locs", geoParams);
return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}
然而,它会返回我想要的所有非故意地址,我只需要从某个点附近找到的地址我找到了一个解决方案。首先,我尝试使用$match和$near,但是没有成功 然后我阅读了关于$geoNear聚合的内容,并尝试将put作为管道的最后一个参数,然而,根据MongoDB页面:“您只能将$geoNear用作管道的第一个阶段。” 我对我需要的$unwind有疑问,但是,我找到了一个参数,它可以帮助我进行数组定位 我的外壳代码:
db.教育机构.合计(
{$geoNear:{near:[-15.795758,-47.892312],maxDistance:50/111.12,distanceField:“addresses.calculated”,includeLocs:“addresses.locs”,niqueDocs:true},
{$project:{“name”:1,“addresses.state”:1,“addresses.locs”:1}}
);
我的Java代码:
公共基本列表查找坐标(双经度、双纬度){
BasicDBObject cmdBody=新的BasicDBObject(“聚合”、“教育机构”);
列表管道=新的ArrayList();
BasicDBObject geoNearParams=新的BasicDBObject();
geoNearParams.put(“近”,新的双[]{经度,纬度,});
geoNearParams.put(“最大距离”,50/111.12);
geoNearParams.put(“距离字段”,“地址.计算”);
geoNearParams.put(“includeLocs”、“addresses.locs”);
geoNearParams.put(“niqueDocs”,true);
BasicDBObject projectParams=新的BasicDBObject();
项目参数put(“名称”,1);
projectParams.put(“addresses.state”,1);
projectParams.put(“addresses.locs”,1);
项目参数put(“课程”,1);
添加(新的BasicDBObject(“$geoNear”,geoNearParams));
添加(新的BasicDBObject(“$project”,projectParams));
cmdBody.put(“管道”,管道);
如果(!getDatastore().getDB().command(cmdBody).ok()){
抛出新的MongoException(getDatastore().getDB().command(cmdBody.getErrorMessage());
}
return(BasicDBList)getDatastore().getDB().command(cmdBody.get(“结果”);
}
Thx
BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");
List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();
BasicDBObject geoNearParams = new BasicDBObject();
geoNearParams.put("near", new double[] {longitude, latitude,});
geoNearParams.put("maxDistance", 50/111.12);
geoNearParams.put("distanceField", "addresses.calculated");
geoNearParams.put("includeLocs", "addresses.locs");
geoNearParams.put("niqueDocs", true);
BasicDBObject projectParams = new BasicDBObject();
projectParams.put("name", 1);
projectParams.put("addresses.state", 1);
projectParams.put("addresses.locs", 1);
projectParams.put("courses", 1);
pipeline.add(new BasicDBObject("$geoNear", geoNearParams));
pipeline.add(new BasicDBObject("$project", projectParams));
cmdBody.put("pipeline", pipeline);
if( !getDatastore().getDB().command(cmdBody).ok() ){
throw new MongoException(getDatastore().getDB().command(cmdBody).getErrorMessage());
}
return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}