启动:mongod --dbpath D:\mondodb(数据库文件存放的位置)
在浏览器输入localhost:27017,出现下图证明启动成功
连接数据库:
mongo
常用命令:
show dbs //查看有多少库
use xxx //创建一个新的库
show collections //查看当前库的所有集合
db.collectionName.insert(obj) //在名为collectionName的集合下插入一条数据,如果该集合不存在,就创建集合
db.collectionName.find() //查找名为collectionName集合的所有记录
两种方式:
2d和2dsphere分别对应平面和球面
2dsphere方式
实体类
@Document(collection = "test")
public class Place {
@Id
private String id;
private String address;
private GeoJsonPoint loc;
测试数据
db.test.insert({"address" : "南京 禄口国际机场","loc" : { "type": "Point", "coordinates": [118.783799,31.979234]}})
db.test.insert({"address" : "南京 浦口公园","loc" : { "type": "Point", "coordinates": [118.639523,32.070078]}})
db.test.insert({"address" : "南京 火车站","loc" : { "type": "Point", "coordinates": [118.803032,32.09248]}})
db.test.insert({"address" : "南京 新街口","loc" : { "type": "Point", "coordinates": [118.790611,32.047616]}})
db.test.insert({"address" : "南京 张府园","loc" : { "type": "Point", "coordinates": [118.790427,32.03722]}})
db.test.insert({"address" : "南京 三山街","loc" : { "type": "Point", "coordinates": [118.788135,32.029064]}})
db.test.insert({"address" : "南京 中华门","loc" : { "type": "Point", "coordinates": [118.781161,32.013023]}})
db.test.insert({"address" : "南京 安德门","loc" : { "type": "Point", "coordinates": [118.768964,31.99646]}})
建立索引:
db.test.ensureIndex( { loc : "2dsphere" } )
检索规定半径以内数据(单位为米)
db.test.find({ "loc" : { "$near" : { "$geometry" : { "type" : "Point", "coordinates" : [118.783799, 31.979234] }, "$maxDistance" : 5000 } } });
对应的代码
@Test
public void lbsFind(){
BasicDBObject basicDBObject = new BasicDBObject("loc", new BasicDBObject("$near",
new BasicDBObject("$geometry",
new BasicDBObject("type","Point").
append("coordinates",new double[]{118.783799,31.979234})).
append("$maxDistance",5000)));//单位米
Query query = new BasicQuery(String.valueOf(basicDBObject));
List<Place> list = mongoTemplate.find(query, Place.class,"test");//test是对应mongodb的集合
for(Place place:list){ //Place.class是对应的实体类
System.out.println(place);
}
}
查询距离
near:从距离最近的点开始搜索
distanceField:存放距离的参数
maxDistance:最远距离
query: 查询条件
num: 返回数据个数(默认为100)
spherical:是否采用球面几何计算
db.test.aggregate([
{
$geoNear:{
near:{type:"Point",coordinates:[118.783799,31.979234]},
distanceField:"dist.calculated",
maxDistance:10000,
spherical:true
}
}
])
对应代码
@Test
public void lbsFindDistance(){
List<BasicDBObject> basicDBList = new ArrayList<>();
BasicDBObject basicDBObject = new BasicDBObject("$geoNear",new BasicDBObject("near",
new BasicDBObject("type","Point").
append("coordinates",new double[]{118.783799,31.979234})).
append("distanceField","distance").
append("maxDistance",10000).
append("spherical",true));
basicDBList.add(basicDBObject);
AggregateIterable<Document> iterable = mongoTemplate.getCollection("test").aggregate(basicDBList);
MongoCursor<Document> cursor = iterable.iterator();
while(cursor.hasNext()){
Document document = cursor.next();
double distance =(double) document.get("distance");
String address =(String) document.get("address");
System.out.println("地址:"+address+" 距离为:"+distance);
}
}
2d方式
实体类
@Document(collection = "test2")
public class PlaceTwo {
@Id
private String id;
private String address;
private double[] locs = new double[2];//double类型二维数组存放经纬度
测试数据
db.test2.insert({"address" : "南京 禄口国际机场","locs" : [118.783799,31.979234]})
db.test2.insert({"address" : "南京 浦口公园","locs" : [118.639523,32.070078]})
db.test2.insert({"address" : "南京 火车站","locs" : [118.803032,32.09248]})
db.test2.insert({"address" : "南京 新街口","locs" : [118.790611,32.047616]})
db.test2.insert({"address" : "南京 张府园","locs" : [118.790427,32.03722]})
db.test2.insert({"address" : "南京 三山街","locs" : [118.788135,32.029064]})
db.test2.insert({"address" : "南京 中华门","locs" : [118.781161,32.013023]})
db.test2.insert({"address" : "南京 安德门","locs" : [118.768964,31.99646]})
建立索引:db.test2.ensureIndex( { locs : "2d" } )
查询方式(五种)
(1)按距离由近到远查询
@Test
public void lbsFind3(){
Point point = new Point(118.783799,31.979234);
Query query = new Query(Criteria.where("locs").near(point).maxDistance(0.1));
List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class,"test2");
for(PlaceTwo place:result){
System.out.println(place);
}
}
(2)圆形查询
@Test
public void lbsFind3(){
Circle circle = new Circle(118.783799,31.979234,0.1);
Query query = new Query(Criteria.where("locs").within(circle));
List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
for(PlaceTwo place:result){
System.out.println(place);
}
}
(3)球星查询
@Test
public void lbsFind3(){
Circle circle = new Circle(118.783799,31.979234,0.003712240453784);
Query query = new Query(Criteria.where("locs").withinSphere(circle));
List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
for(PlaceTwo place:result){
System.out.println(place);
}
}
(4)空间距离查询
@Test
public void lbsFind3(){
Point point = new Point(118.783799,31.979234);
Query query = new Query(Criteria.where("locs").nearSphere(point).maxDistance(0.003712240453784));
List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
for(PlaceTwo place:result){
System.out.println(place);
}
}
(5)最近点查询(可以直接返回距离)
@Test
public void lbsFind2(){
Point point = new Point(118.783799,31.979234);
NearQuery query = NearQuery.near(point).maxDistance(new Distance(10, Metrics.KILOMETERS));
GeoResults<PlaceTwo> result = mongoTemplate.geoNear(query, PlaceTwo.class, "test2");
List<GeoResult<PlaceTwo>> content = result.getContent();
for(GeoResult<PlaceTwo> place:content){
System.out.println(place+" 距离为:"+place.getDistance().getValue());
}
}