MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引

MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别。例如用Document替换BasicDBObject、通过Builders类构建Bson替代直接输入$命令等,本文整理了基于3.2版本的常用增删改查操作的使用方法。为了避免冗长的篇幅,分为增删改、查询、聚合、地理索引等几部分。

随着移动设备的普及,基于坐标和经纬度的位置查询变得越来越流行,例如查找离当前位置最近的N辆出租车。Mongodb专门针对这种查询建立了地理空间索引:2d和2dsphere索引。2d用于平面基于坐标的位置计算,2dsphere主要用于球体,比如地球,提供了基于弧度的位置计算。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. import static com.mongodb.client.model.Indexes.geo2d;  
  2. import static com.mongodb.client.model.Indexes.geo2dsphere;  
  3.   
  4. import java.text.ParseException;  
  5. import java.util.ArrayList;  
  6. import java.util.Arrays;  
  7. import java.util.List;  
  8.   
  9. import org.bson.Document;  
  10.   
  11. import com.mongodb.Block;  
  12. import com.mongodb.MongoClient;  
  13. import com.mongodb.client.FindIterable;  
  14. import com.mongodb.client.MongoCollection;  
  15. import com.mongodb.client.MongoDatabase;  
  16. import com.mongodb.client.model.Filters;  
  17. import com.mongodb.client.model.geojson.LineString;  
  18. import com.mongodb.client.model.geojson.Point;  
  19. import com.mongodb.client.model.geojson.Polygon;  
  20. import com.mongodb.client.model.geojson.Position;  
  21.   
  22. public class GeospatialExamples {  
  23.   
  24.     public static void main(String[] args) throws ParseException {  
  25.         MongoClient mongoClient = new MongoClient("localhost"27017);  
  26.         MongoDatabase database = mongoClient.getDatabase("lesson");  
  27.           
  28.         GeospatialExamples client = new GeospatialExamples(database);  
  29.         client.show();  
  30.         mongoClient.close();  
  31.     }  
  32.       
  33.     private MongoDatabase database;  
  34.     public GeospatialExamples(MongoDatabase database) {  
  35.         this.database = database;  
  36.     }  
  37.       
  38.     public void show() {  
  39.         MongoCollection<Document> mc = database.getCollection("people");  
  40.         mc.drop();  
  41.           
  42.         Document doc1 = new Document("name""tom").append("raid", Arrays.asList(1010)).append("gps"new Point(new Position(1010)));  
  43.         Document doc2 = new Document("name""jone").append("raid", Arrays.asList(10.110)).append("gps"new Point(new Position(10.110)));  
  44.         Document doc3 = new Document("name""john").append("raid", Arrays.asList(1010.1)).append("gps"new Point(new Position(1010.1)));  
  45.         Document doc4 = new Document("name""jack").append("raid", Arrays.asList(9.910)).append("gps"new Point(new Position(9.910)));  
  46.         Document doc5 = new Document("name""mary").append("raid", Arrays.asList(109.9)).append("gps"new Point(new Position(109.9)));  
  47.         Document doc6 = new Document("name""abby").append("raid", Arrays.asList(10.210)).append("gps"new Point(new Position(10.210)));  
  48.         Document doc7 = new Document("name""adam").append("raid", Arrays.asList(10.310)).append("gps"new Point(new Position(10.310)));  
  49.         Document doc8 = new Document("name""barry").append("raid", Arrays.asList(10.410)).append("gps"new Point(new Position(10.410)));  
  50.         Document doc9 = new Document("name""anne").append("raid", Arrays.asList(10.510)).append("gps"new Point(new Position(10.510)));  
  51.         mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5, doc6, doc7, doc8, doc9));  
  52.           
  53.         mc.createIndex(geo2d("raid"));  
  54.         mc.createIndex(geo2dsphere("gps"));  
  55.           
  56.         //$geoWithin 匹配任意几何图形内搜索  
  57.         FindIterable<Document> iterable = mc.find(Filters.geoWithin("raid"new Polygon(Arrays.asList(new Position(10.210), new Position(1010.2), new Position(9.810), new Position(109.8), new Position(10.210)))));  
  58.         printResult("Filters.geoWithin raid", iterable);  
  59.           
  60.         //$geoWithinBox 在以左下角和右上角坐标构成方形内搜索  
  61.         iterable = mc.find(Filters.geoWithinBox("raid"9.89.810.210.2));  
  62.         printResult("Filters.geoWithinBox raid", iterable);  
  63.           
  64.         //$geoWithinPolygon 在多边形内搜索  
  65.         List<Double> p1 = new ArrayList<>();  
  66.         List<Double> p2 = new ArrayList<>();  
  67.         List<Double> p3 = new ArrayList<>();  
  68.         p1.add(10d);  
  69.         p1.add(10d);  
  70.         p2.add(10.1);  
  71.         p2.add(10.16);  
  72.         p3.add(10.2);  
  73.         p3.add(10d);  
  74.         List<List<Double>> polygon = Arrays.asList(p1, p2, p3);  
  75.         iterable = mc.find(Filters.geoWithinPolygon("raid", polygon));  
  76.         printResult("Filters.geoWithinPolygon raid", iterable);  
  77.   
  78.         p2.clear();  
  79.         p2.add(9.9);  
  80.         p2.add(10.16);  
  81.         p3.clear();  
  82.         p3.add(9.8);  
  83.         p3.add(10d);  
  84.         polygon = Arrays.asList(p1, p2, p3);  
  85.         iterable = mc.find(Filters.geoWithinPolygon("gps", polygon));  
  86.         printResult("Filters.geoWithinPolygon gps", iterable);  
  87.           
  88.         //$geoWithinCenter 在指定圆心和半径的圆形内搜索  
  89.         iterable = mc.find(Filters.geoWithinCenter("raid", 10d, 10d, 0.25));  
  90.         printResult("Filters.geoWithinCenter raid", iterable);  
  91.           
  92.         //$geoWithinCenterSphere 在球体(地球)上指定圆心和弧度搜索, 例如搜索以[10,10]为中心500米内的文档, 参数为...10d, 10d, 0.5/6371  
  93.         iterable = mc.find(Filters.geoWithinCenterSphere("gps", 10d, 10d, 11d/6371));  
  94.         printResult("Filters.geoWithinCenterSphere gps", iterable);  
  95.   
  96.         //$geoIntersects  
  97.         iterable = mc.find(Filters.geoIntersects("gps"new LineString(Arrays.asList(new Position(1010.1), new Position(10.110), new Position(109.9)))));  
  98.         printResult("Filters.geoIntersects gps", iterable);  
  99.           
  100.         //$near  
  101.         iterable = mc.find(Filters.near("gps"new Point(new Position(1010)), 20566d, 0d));  
  102.         printResult("Filters.near gps", iterable);  
  103.           
  104.         //$nearSphere  
  105.         iterable = mc.find(Filters.nearSphere("gps"new Point(new Position(1010)), 20566d, 10d));  
  106.         printResult("Filters.nearSphere gps", iterable);  
  107.     }  
  108.       
  109.     public void printResult(String doing, FindIterable<Document> iterable) {  
  110.         System.out.println(doing);  
  111.         iterable.forEach(new Block<Document>() {  
  112.             public void apply(final Document document) {  
  113.                 System.out.println(document);  
  114.             }  
  115.         });  
  116.         System.out.println("------------------------------------------------------");  
  117.         System.out.println();  
  118.     }  
  119. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值