1.在mongodb的shard集群中,基于2dsphere,没法在find命令中使用:db.sz_user({loc:{$near:{……}}),这是mongodb的一个bug,会报错:use geoNear command rather than $near query,但是在非shard集群中是可以在find中使用$near。shard集群中使用runCommand是可以的,但是runCommand在高并发时,会停顿几秒,使用db.sz_user.aggregate($geoNear)能解决此问题。所以一句话,在shard集群中,$near没法用,runCommand高并发性能有问题,$geoNear才能完美解决此问题
mongo非集群:
@Autowired //织入mongo模板连接 private MongoTemplate mongoTemplate; @Override public List<Bike> findNear(Bike bike) { //加入查询条件 bike.getLongitude() bike.getLatitude() 经度纬度 status 状态 Query query=new Query(); query.addCriteria(Criteria.where("status").is(bike.getStatus())) .addCriteria(Criteria.where("loc").near(new Point(bike.getLongitude(),bike.getLatitude()))) .limit(10); //Bike.class自己的封装类 , “bike”mongoDB的集合名 List<Bike> list=this.mongoTemplate.find(query, Bike.class, "bike"); //已经获取数据,根据自己的业务来写 for(Bike b:list){ b.setBid(b.getId()); b.setId(null); b.setLatitude(b.getLoc()[0]); b.setLongitude(b.getLoc()[1]); b.setLoc(null); } return list; }mongo集群要修改以上代码:
@Override public List<Bike> findNear(Bike bike) { Point point = new Point( bike.getLongitude(),bike.getLatitude()); //.num()是设置查询返回的结果数量。如果大于5条就只返回5条。 //radius 单位为m,所以要转成km. NearQuery query = NearQuery .near(point) .maxDistance(new Distance(1000 / 1000, Metrics.KILOMETERS)) .num(10L); GeoResults<Bike> geoResults = mongoTemplate.geoNear(query, Bike.class, "bike"); List<GeoResult<Bike>> content = geoResults.getContent(); //如果想获取查询结果集是自己封装的数据。只需要在进行一次遍历 List<Bike> list=new ArrayList<Bike>(); for (GeoResult<Bike> geoResult: content) { Bike b = geoResult.getContent(); System.out.println("===="+b.toString()); b.setBid(b.getId()); b.setLatitude(b.getLoc()[1]); b.setLongitude(b.getLoc()[0]); list.add(b); } return list; }3.Command failed with error 17444: 'Legacy point is out of bounds for spherical query
如果出现3这个错误就是地理位置写反了需要调整Point point = new Point( bike.getLongitude(),bike.getLatitude());
再看看mongo中的loc 位置是否正确