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

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

import static com.mongodb.client.model.Indexes.geo2d;
import static com.mongodb.client.model.Indexes.geo2dsphere; import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import org.bson.Document; import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.geojson.LineString;
import com.mongodb.client.model.geojson.Point;
import com.mongodb.client.model.geojson.Polygon;
import com.mongodb.client.model.geojson.Position; public class GeospatialExamples { public static void main(String[] args) throws ParseException {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("lesson"); GeospatialExamples client = new GeospatialExamples(database);
client.show();
mongoClient.close();
} private MongoDatabase database;
public GeospatialExamples(MongoDatabase database) {
this.database = database;
} public void show() {
MongoCollection<Document> mc = database.getCollection("people");
mc.drop(); Document doc1 = new Document("name", "tom").append("raid", Arrays.asList(10, 10)).append("gps", new Point(new Position(10, 10)));
Document doc2 = new Document("name", "jone").append("raid", Arrays.asList(10.1, 10)).append("gps", new Point(new Position(10.1, 10)));
Document doc3 = new Document("name", "john").append("raid", Arrays.asList(10, 10.1)).append("gps", new Point(new Position(10, 10.1)));
Document doc4 = new Document("name", "jack").append("raid", Arrays.asList(9.9, 10)).append("gps", new Point(new Position(9.9, 10)));
Document doc5 = new Document("name", "mary").append("raid", Arrays.asList(10, 9.9)).append("gps", new Point(new Position(10, 9.9)));
Document doc6 = new Document("name", "abby").append("raid", Arrays.asList(10.2, 10)).append("gps", new Point(new Position(10.2, 10)));
Document doc7 = new Document("name", "adam").append("raid", Arrays.asList(10.3, 10)).append("gps", new Point(new Position(10.3, 10)));
Document doc8 = new Document("name", "barry").append("raid", Arrays.asList(10.4, 10)).append("gps", new Point(new Position(10.4, 10)));
Document doc9 = new Document("name", "anne").append("raid", Arrays.asList(10.5, 10)).append("gps", new Point(new Position(10.5, 10)));
mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5, doc6, doc7, doc8, doc9)); mc.createIndex(geo2d("raid"));
mc.createIndex(geo2dsphere("gps")); //$geoWithin 匹配任意几何图形内搜索
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)))));
printResult("Filters.geoWithin raid", iterable); //$geoWithinBox 在以左下角和右上角坐标构成方形内搜索
iterable = mc.find(Filters.geoWithinBox("raid", 9.8, 9.8, 10.2, 10.2));
printResult("Filters.geoWithinBox raid", iterable); //$geoWithinPolygon 在多边形内搜索
List<Double> p1 = new ArrayList<>();
List<Double> p2 = new ArrayList<>();
List<Double> p3 = new ArrayList<>();
p1.add(10d);
p1.add(10d);
p2.add(10.1);
p2.add(10.16);
p3.add(10.2);
p3.add(10d);
List<List<Double>> polygon = Arrays.asList(p1, p2, p3);
iterable = mc.find(Filters.geoWithinPolygon("raid", polygon));
printResult("Filters.geoWithinPolygon raid", iterable); p2.clear();
p2.add(9.9);
p2.add(10.16);
p3.clear();
p3.add(9.8);
p3.add(10d);
polygon = Arrays.asList(p1, p2, p3);
iterable = mc.find(Filters.geoWithinPolygon("gps", polygon));
printResult("Filters.geoWithinPolygon gps", iterable); //$geoWithinCenter 在指定圆心和半径的圆形内搜索
iterable = mc.find(Filters.geoWithinCenter("raid", 10d, 10d, 0.25));
printResult("Filters.geoWithinCenter raid", iterable); //$geoWithinCenterSphere 在球体(地球)上指定圆心和弧度搜索, 例如搜索以[10,10]为中心500米内的文档, 参数为...10d, 10d, 0.5/6371
iterable = mc.find(Filters.geoWithinCenterSphere("gps", 10d, 10d, 11d/6371));
printResult("Filters.geoWithinCenterSphere gps", iterable); //$geoIntersects
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)))));
printResult("Filters.geoIntersects gps", iterable); //$near
iterable = mc.find(Filters.near("gps", new Point(new Position(10, 10)), 20566d, 0d));
printResult("Filters.near gps", iterable); //$nearSphere
iterable = mc.find(Filters.nearSphere("gps", new Point(new Position(10, 10)), 20566d, 10d));
printResult("Filters.nearSphere gps", iterable);
} public void printResult(String doing, FindIterable<Document> iterable) {
System.out.println(doing);
iterable.forEach(new Block<Document>() {
public void apply(final Document document) {
System.out.println(document);
}
});
System.out.println("------------------------------------------------------");
System.out.println();
}
}

MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引的更多相关文章

  1. MongoDB-JAVA-Driver 3.2版本常用代码全整理(3) - 聚合

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  2. MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  3. MongoDB-JAVA-Driver 3.2版本常用代码全整理(1) - 增删改

    MongoDB的3.x版本java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  4. MongoDB Java Driver操作指南

    MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...

  5. Mongodb Java Driver 参数配置解析

    要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...

  6. 单元测试系列之十:Sonar 常用代码规则整理(二)

    摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...

  7. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  8. MongoDB Java Driver

    本文使用 Java 来描述对 Mongodb 的相关操作,数据库版本是 3.2.8,驱动版本为 3.2.2. 本文将讨论 如何连接MongoDB 文档的 CURD 操作 文档的上传和下载 1. 连接到 ...

  9. MongoDB Java Driver 3.4操作

    导入jar包 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-dr ...

随机推荐

  1. Adobe Flash Builder 4.7破解方法(绝对可用)

    Flash Builder4.7 破解方法的实践 建议:作为草根一级,买不起正版,只能先拿破解版练练手了,如果商业的话,请用正版.  具体步骤如下: 1.到Adobe官网下载FlashBuilder  ...

  2. Radio Basics for RFID

    Radio Basics for RFID The following is excerpted from Chapter 3: Radio Basics for UHF RFID from the ...

  3. Javascript 风格向导

    序   大部分针对Javascript最合理的方法归纳.   类型   • 原始类型:我们可以直接使用值. ο string ο number ο boolean ο null ο undefined ...

  4. Git相关操作及记录

    一.软件 1.下载Git客户端软件 Widows平台: https://github.com/git-for-windows/git/releases/download/v2.13.0.windows ...

  5. Exp4恶意代码分析 20164312 马孝涛

    1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行.  1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sy ...

  6. st9720-GB 中文编码对照表

    做嵌入式LED 屏幕显示的时候,需要ST9720 中文编码,网上找了好几个版本,版本不同居然对应的code也不同!找了一个靠谱的pdf版本编码对照表,供大家参考 ..... ..... 下载地址: h ...

  7. Linux 我的常用命令记录

    Linux下复制粘贴快捷键 1. 在终端下: 复制命令:Ctrl + Shift + C  组合键. 粘贴命令:Ctrl + Shift + V  组合键. 2. 在控制台下: 复制命令:Ctrl + ...

  8. 持续集成①安装部署jenkins从git获取代码

    持续集成①安装部署jenkins从git获取代码 一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部 ...

  9. Codeforces 1114E - Arithmetic Progression - [二分+随机数]

    题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...

  10. codevs 3022 西天收费站

    题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入每个收费站的每种方法收的钱,输出最少花的钱 ...