• MongoDB-JAVA-Driver 3.2版本常用代码全整理(4)


    转载,原文连接:http://blog.csdn.net/autfish/article/details/51439742

    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(10, 10)).append("gps", new Point(new Position(10, 10)));  
    43.         Document doc2 = new Document("name", "jone").append("raid", Arrays.asList(10.1, 10)).append("gps", new Point(new Position(10.1, 10)));  
    44.         Document doc3 = new Document("name", "john").append("raid", Arrays.asList(10, 10.1)).append("gps", new Point(new Position(10, 10.1)));  
    45.         Document doc4 = new Document("name", "jack").append("raid", Arrays.asList(9.9, 10)).append("gps", new Point(new Position(9.9, 10)));  
    46.         Document doc5 = new Document("name", "mary").append("raid", Arrays.asList(10, 9.9)).append("gps", new Point(new Position(10, 9.9)));  
    47.         Document doc6 = new Document("name", "abby").append("raid", Arrays.asList(10.2, 10)).append("gps", new Point(new Position(10.2, 10)));  
    48.         Document doc7 = new Document("name", "adam").append("raid", Arrays.asList(10.3, 10)).append("gps", new Point(new Position(10.3, 10)));  
    49.         Document doc8 = new Document("name", "barry").append("raid", Arrays.asList(10.4, 10)).append("gps", new Point(new Position(10.4, 10)));  
    50.         Document doc9 = new Document("name", "anne").append("raid", Arrays.asList(10.5, 10)).append("gps", new Point(new Position(10.5, 10)));  
    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.2, 10), new Position(10, 10.2), new Position(9.8, 10), new Position(10, 9.8), new Position(10.2, 10)))));  
    58.         printResult("Filters.geoWithin raid", iterable);  
    59.           
    60.         //$geoWithinBox 在以左下角和右上角坐标构成方形内搜索  
    61.         iterable = mc.find(Filters.geoWithinBox("raid", 9.8, 9.8, 10.2, 10.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(10, 10.1), new Position(10.1, 10), new Position(10, 9.9)))));  
    98.         printResult("Filters.geoIntersects gps", iterable);  
    99.           
    100.         //$near  
    101.         iterable = mc.find(Filters.near("gps", new Point(new Position(10, 10)), 20566d, 0d));  
    102.         printResult("Filters.near gps", iterable);  
    103.           
    104.         //$nearSphere  
    105.         iterable = mc.find(Filters.nearSphere("gps", new Point(new Position(10, 10)), 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. }  
  • 相关阅读:
    UCloud可用区的设计理念及功能图文详解
    Centos优化Hadoop
    Linux下使用fdisk扩展分区容量
    Linux内核之数据双链表
    安装 openSUSE Leap 42.1 之后要做的 8 件事
    Linux的防火墙–Iptables
    【转】c# thread.join 理解
    【转】Oracle 查询库中所有表名、字段名、表名说明、字段名说明
    【转】WinForms 使用Graphics绘制字体阴影
    WPF 如何加载图片
  • 原文地址:https://www.cnblogs.com/sa-dan/p/6836663.html
Copyright © 2020-2023  润新知