本文使用 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的更多相关文章

  1. MongoDB Java Driver操作指南

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

  2. Mongodb Java Driver 参数配置解析

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

  3. MongoDB Java Driver 3.4操作

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

  4. BuguMongo是一个MongoDB Java开发框架,集成了DAO、Query、Lucene、GridFS等功能

    http://code.google.com/p/bugumongo/ 简介 BuguMongo是一个MongoDB Java开发框架,它的主要功能包括: 基于注解的对象-文档映射(Object-Do ...

  5. 数据库.MongoDB.Java样例

    1.先在MongoDB官网下载Java驱动包 MongoDB Java Driver: http://mongodb.github.io/mongo-java-driver/ JAR包下载列表 htt ...

  6. 给java mongodb 官方driver 增加bean 操作

      mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类 ...

  7. Date, TimeZone, MongoDB, java中date的时区问题

    打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...

  8. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

  9. MongoDB C Driver使用教程

    MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...

随机推荐

  1. Ext.NET 4.1 系统框架的搭建(后台) 附源码

    Ext.NET 4.1 系统框架的搭建(后台) 附源码 代码运行环境:.net 4.5  VS2013 (代码可直接编译运行) 预览图: 分析图: 上面系统的构建包括三块区域:North.West和C ...

  2. 从NavigationController 下的UITableView中移除 header

    this.AutomaticallyAdjustsScrollViewInsets = false; 解析:AutomaticallyAdjustsScrollViewInsets为系统自动为适应na ...

  3. csharp:using OpenXml SDK 2.0 and ClosedXML read excel file

    https://openxmlexporttoexcel.codeplex.com/ http://referencesource.microsoft.com/ 引用: using System; u ...

  4. 微软Dynamics 使用葡萄城的Wijmo 5提供移动端用户界面选择

    近日,全球最大的控件提供商葡萄城公司宣布: 葡萄城近日与微软公司达成合作,将Wijmo 产品线的HTML5和JaveScript 控件融合到微软Dynamics CRMOnline 2016版中. 随 ...

  5. 孙鑫MFC学习笔记7:对话框编程(上)

    1.DoModal创建模态对话框 2.Create创建非模态对话框(需要用ShowWindow显示出来) 模态:对话框显示,程序会暂停,直到对话框关闭 非模态:对话框显示,程序继续执行 3.对于模态对 ...

  6. 【java手记】------------------------java中转发和重定向区别

    转发: request.getRequestDispatcher("success.jsp").forward(request,response); 在服务器组件收到用户请求后.经 ...

  7. Java面试题系列 提高Java I/O 性能

    1.提高java的 i/o性能.. http://blog.csdn.net/cherami/article/details/3854 我们知道Java中一般的输入输出流都是用单字节的读取方法来进行I ...

  8. 【转】Nginx区分PC或手机访问不同网站

    原文链接:http://www.nginx.cn/784.html 近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合 ...

  9. mvc和iis工作原理

    学习IIS & MVC的运行原理 我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件.这其中是怎样的 ...

  10. go语言最新版本 下载地址

    国内官方网站无法打开.放在了百度云中,定期会更新: 链接:http://pan.baidu.com/s/1dD59duh 密码:46ek 备用地址:http://pan.baidu.com/s/1hq ...