springboot整合mongo集群
对mongo中ibike下的bike进行地理位置查询
已添加索引 db.bike.ensureIndex({loc:"2d",status:1})
测试报错 ‘use geoNear command rather than $near query’ on server xxxx’…
配置代码:
@Bean // MongoTemplate由spring 托管
@Primary
public MongoTemplate template() {
return new MongoTemplate(factory());
}
/**
* 功能描述: 创建数据库名称对应的工厂,数据库名称可以通过配置文件导入
* @param
* @return:org.springframework.data.mongodb.MongoDbFactory
* @since: v1.0
*/
@Bean("mongoDbFactory")
public MongoDbFactory factory() {
return new SimpleMongoDbFactory(client(), "ibike");
}
/**
* 功能描述: 配置client,client中传入的ip和端口可以通过配置文件读入
*
* @param
* @return:com.mongodb.MongoClient
*/
@Bean("mongoClient")
public MongoClient client() {
List<ServerAddress> list=new ArrayList<ServerAddress>();
ServerAddress sa1=new ServerAddress("192.168.146.200",23000);
ServerAddress sa2=new ServerAddress("192.168.146.201",23000);
ServerAddress sa3=new ServerAddress("192.168.146.202",23000);
list.add( sa1 );
list.add( sa2 );
list.add( sa3 );
return new MongoClient( list );
//return new MongoClient("192.168.146.200", 27017);
}
业务代码:
@Override
public List<Bike> findNearAll(Bike bike) {
Point point = new Point(bike.getLatitude(), bike.getLongitude());
Query q=new Query(
Criteria.where("loc").near(point)
.maxDistance(20)
)
.limit(10);
List<Bike> list = mongoTemplate.find( q, Bike.class);
for (Bike b : list) {
b.setBid(b.getId());
b.setLatitude(b.getLoc()[0]);
b.setLongitude(b.getLoc()[1]);
}
return list;
}
测试代码:
@Test
public void testNearBikes() {
Bike b=new Bike();
b.setLatitude(28.16942263);
b.setLongitude(112.9838513);
b.setLoc(null);
List<Bike> list=bikeService.findNearAll(b);
System.out.println(list);
}
报错原因:
ibike下的bike集合在先前执行了分片命令db.runCommand({"shardcollection":"ibike.bike","key":{_id:'hashed'}})
应该是导致索引方面的问题出错 从而报错(具体原因?)
但仍然需要对库进行分片db.runCommand({"enablesharding":"ibike"})