MongoDB Java Driver
本文使用 Java 来描述对 Mongodb 的相关操作,数据库版本是 3.2.8,驱动版本为 3.2.2。
本文将讨论
- 如何连接MongoDB
- 文档的 CURD 操作
- 文档的上传和下载
1. 连接到MongoDB
首先保证 mongodb 启动了身份验证功能(不启动直接使用IP,Port连接即可)。连接目标可分为三种:单机,集群和副本集。
1.1 连接单机和集群
站在代码的角度,单机和集群的区别就是端口号不同,假设服务器地址和端口号为:192.168.0.8和27017,则连接代码如下:
String user = "admin"; String pwd = "111111"; String authDb = "admin"; String host = "192.168.0.8"; int port = 27017; // 1. 直接连接 MongoCredential credential = MongoCredential.createCredential(user, authDb, pwd.toCharArray()); MongoClient mongoClient = new MongoClient(new ServerAddress(host , port), Arrays.asList(credential)); // 2. 使用连接字符串连接 // mongodb://user:pwd@host:port/?authSource=db String conString = "mongodb://{0}:{1}@{2}:{3}/?authSource={4}"; MongoClientURI uri = new MongoClientURI(MessageFormat.format(conString, user, pwd, host, port+"", authDb)); //注意port为字符串 MongoClient mongoClient = new MongoClient(uri);
1.2 连接副本集
// 1. 直接连接 MongoClient mongoCli1ent = new MongoClient( Arrays.asList(new ServerAddress("localhost", 27017), new ServerAddress("localhost", 27018)), Arrays.asList(MongoCredential.createCredential(user, authDb, pwd.toCharArray()))); // 2. 使用连接字符串 // mongodb://user:pwd@host:port, host:port/?authSource=db&replicaSet=rs&slaveOk=true String conStr = "mongodb://{0}:{1}@{2}:{3},{4}:{5}/?authSource={6}&replicaSet={7}&slaveOk=true"; MongoClientURI uri=new MongoClientURI(MessageFormat.format(conStr,"admin","111","host1","27017","host2","27018","admin","rs0")); MongoClient mongoClient = new MongoClient(uri);
1.3 关于连接相关的参数
不管是使用字符串连接,还是直接连接都可以附带一些参数,直接连接时用 MongoClientOptions 类的builder()构造,字符串直接使用 & 拼接在后面就行。常用的参数如下:
replicaSet=name | 副本集名称 | ssl=true|false | 是否使用ssl |
connectTimeoutMS=ms | 连接超时时间 | socketTimeoutMS=ms | socket超时时间 |
maxPoolSize=n | 连接池大小 | safe=true|false | 驱动是否发送getLastError |
journal=true|false | 是否等待将日志刷到磁盘 | ||
authMechanism= | 身份验证方式 | 验证方式有SCRAM-SHA-1 | MONGODB-X509,MONGO-CR,etc |
authSource=string | 验证数据库,默认admin | 采用指定数据库的验证方式 | 3.0之后,默认验证方式为 SCRAM-SHA-1. |
更多详细的参数请见:MongoClientURI
2. 文档的 CURD 操作
在进行 CURD 操作时,有几个常用的辅助静态类:Filters, Sorts, Projections,Updates,详细用法请查看:Builders
(1)文档的插入
// 获取待插入集合 mycol MongoDatabase mydb = mongoClient.getDatabase("myDb"); MongoCollection<Document> mycol = mydb.getCollection("myCol"); // 生成一个文档 Document doc = new Document(); doc.put("name", "cyhe"); doc.put("blog", "http://www.cnblogs.com/cyhe/"); // 也可以使用链式风格构建 new Document("id",1).append("name", "cyhe");// ... etc // 也可以直接将 JSON 转成 BSON doc = Document.parse("{\"name\":\"cyhe\",\"blog\":\"http://www.cnblogs.com/cyhe/\"}"); // 插入 mycol.insertOne(doc); // 批量插入 mycol.insertMany(new ArrayList<Document>());
(2)文档的查找
// 查询集合所有文档 List<Document> docs = mycol.find().into(new ArrayList<Document>()); // 直接导入 import static com.mongodb.client.model.Filters.*; 就可以直接使用 and eq 等静态方法 // 查询 age = 20 的文档 Document doc = mycol.find(Filters.eq("age", 20)).first(); // 查询 10<age<20 的文档 返回一个游标 MongoCursor<Document> cur=mycol.find(Filters.and(Filters.gt("age", 10), Filters.lt("age", 20))).iterator();
(3)文档的更新和删除
// 查找并删除名称为 cyhe 的文档 mycol.findOneAndDelete(Filters.eq("name", "cyhe")); // 查找并重命名 mycol.findOneAndUpdate(Filters.eq("name", "cyhe"), Updates.set("name", "wqq")); // 小于10的都加1 mycol.updateMany(Filters.lt("size", 10), Updates.inc("size", 1)); // 删除 age 大于 110 的文档 mycol.deleteOne(Filters.gt("age", "110"));
3. 文档的上传和下载
在Mongodb中,普通文档最大为16M,对于图片,附件来说就显得比较小了,mongodb的处理方式就是使用 GridFS 分块存储。
// GridFS 默认的名字为 fs,使用默认名称连接 GridFSBucket gridFSBucket = GridFSBuckets.create(mydb); // 使用指定名称连接 GridFSBucket gridFSBucket1 = GridFSBuckets.create(mydb, "imags"); // 上传文件 // ============================================================================================== InputStream streamToUploadFrom = new FileInputStream(new File("/tmp/mongodb-tutorial.pdf")); // 自定义参数 GridFSUploadOptions options = new GridFSUploadOptions() .chunkSizeBytes(1024) .metadata(new Document("type", "presentation")); ObjectId fileId = gridFSBucket.uploadFromStream("mongodb-tutorial", streamToUploadFrom, options); // =============================================================================================== // 或者使用 GridFSUploadStream byte[] data = "Data to upload into GridFS".getBytes(StandardCharsets.UTF_8); GridFSUploadStream uploadStream = gridFSBucket.openUploadStream("sampleData", options); uploadStream.write(data); uploadStream.close(); System.out.println("The fileId of the uploaded file is: " + uploadStream.getFileId().toHexString()); // =============================================================================================== // 下载文件 // =============================================================================================== // 根据生成的 ObjectId 下载 FileOutputStream streamToDownloadTo = new FileOutputStream("/tmp/mongodb-tutorial.pdf"); gridFSBucket.downloadToStream(fileId, streamToDownloadTo); streamToDownloadTo.close(); System.out.println(streamToDownloadTo.toString()); // =============================================================================================== // 根据文件名称下载 FileOutputStream streamToDownloadTo = new FileOutputStream("/tmp/mongodb-tutorial.pdf"); GridFSDownloadByNameOptions downloadOptions = new GridFSDownloadByNameOptions().revision(0); gridFSBucket.downloadToStreamByName("mongodb-tutorial", streamToDownloadTo, downloadOptions); streamToDownloadTo.close(); // =============================================================================================== // 使用 GridFSDownloadStream 根据 ObjectId 下载 GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId); int fileLength = (int) downloadStream.getGridFSFile().getLength(); byte[] bytesToWriteTo = new byte[fileLength]; downloadStream.read(bytesToWriteTo); downloadStream.close(); System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8)); // =============================================================================================== // 使用 GridFSDownloadStream 根据 名称 下载 GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStreamByName("sampleData"); int fileLength = (int) downloadStream.getGridFSFile().getLength(); byte[] bytesToWriteTo = new byte[fileLength]; downloadStream.read(bytesToWriteTo); downloadStream.close(); System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8));
本文只是 Mongodb 操作的冰山一角,更多的用法,会在以后的实战中不断更新完善。更多用法和 API 介绍,详见 MongoDB-Java-3.2
MongoDB Java Driver的更多相关文章
- MongoDB Java Driver操作指南
MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...
- Mongodb Java Driver 参数配置解析
要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...
- MongoDB Java Driver 3.4操作
导入jar包 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-dr ...
- BuguMongo是一个MongoDB Java开发框架,集成了DAO、Query、Lucene、GridFS等功能
http://code.google.com/p/bugumongo/ 简介 BuguMongo是一个MongoDB Java开发框架,它的主要功能包括: 基于注解的对象-文档映射(Object-Do ...
- 数据库.MongoDB.Java样例
1.先在MongoDB官网下载Java驱动包 MongoDB Java Driver: http://mongodb.github.io/mongo-java-driver/ JAR包下载列表 htt ...
- 给java mongodb 官方driver 增加bean 操作
mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类 ...
- Date, TimeZone, MongoDB, java中date的时区问题
打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...
- [译] MongoDB Java异步驱动快速指南
导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...
- MongoDB C Driver使用教程
MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...
随机推荐
- SQL SERVER与C#中数据类型的对应关系
对应关系表 SQL Server2000 http://hovertree.com/menu/sqlserver/ C# CodeSmith 数据类型 取值范围 数据类型 取值范围 空值代替值 数据类 ...
- hibernate----N-N--(人与地点)
package com.ij34.dao; import java.util.HashSet; import java.util.Set; import javax.persistence.*; @E ...
- 修复 XE8 Win 平台 Firemonkey Memo 卷动后会重叠的问题
问题:XE8 Firemonkey 在 Windows 平台 Memo 卷动时,在第 1 , 2 行会产生重叠现象. 更新:XE8 update 1 已经修复这个问题,无需再使用下面方法. 修改前: ...
- Flume
http://www.ibm.com/developerworks/cn/data/library/bd-1404flumerevolution/index.html https://flume.ap ...
- Gym 101102D---Rectangles(单调栈)
题目链接 http://codeforces.com/gym/101102/problem/D problem description Given an R×C grid with each cel ...
- Eclipse功能集合
大家好,这篇博客的目的是总结一下Eclipse这个软件中一些不为常用的功能.与大家分享.谢谢~ 1.利用one hour看了一下Eclipse的使用,用two hour写了这篇blog. 2.在现实项 ...
- ViewPager的刷新、限制预加载、缓存所有
[框架]: 公共部分:左侧菜单.TitleBar.RadioGroup(3个RadioButton:X.Y.Z) 选择X页面:指示器+ViewPager [要达成的效果]: (1)左侧选择A,进入X页 ...
- linux系统下nodejs安装过程随记
首先下载适合的版本.这里我使用的是node v.10.36 先介绍编译安装的详细过程. 下载该版本: wget http://nodejs.org/dist/v0.10.36/node-v0.10.3 ...
- mysql 5.7.17发布
Mysql 5.7.17发布了,主要修复: Changes in MySQL 5.7.17 (2016-12-12, General Availability) Compilation Notes M ...
- linux常用命令之文件权限
CHGRP chgrp – change group ownership,改变组别的所有权 用法 chgrp 组别名 文件\目录名 选项 -R (recursive)递归改变,将目录下所有的文件和目 ...