最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装、客户端操作、安全认证、副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很大。特此记录,以备查看。

文章目录:

MongoDB和Java(1):Linux下的MongoDB安装

MongoDB和Java(2):普通用户启动mongod进程

MongoDB和Java(3):Java操作MongoB

MongoDB和Java(4):Spring Data整合MongoDB(XML配置)

MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群

MongoDB和Java(7):MongoDB用户管理

本文记录如何使用mongodb-driver连接mongodb数据库,以及进行简单的增删改查操作,使用起来还是比较简单的。

源代码下载
MongoDB和Java学习代码.zip

1、环境和依赖

MongoDB服务器操作系统    CentOS 6.5

MongoDB版本            4.0.2

客户端操作系统          Windows 7 64位

Eclipse             Luna Service Release 2 (4.4.2)

Maven              3.2.1

JDK                1.8.0_141

我们使用mongodb-driver 3.6.4编写代码

首先引入依赖

 <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>

2、连接MongoDB服务器

 MongoClient mongoClient = null;

 try {

     mongoClient = new MongoClient("10.10.12.195", 27017);

     // show dbs
MongoIterable<String> databaseNames = mongoClient.listDatabaseNames();
for (String name : databaseNames) {
System.out.println(name);
} // 连接test库
MongoDatabase mgdb = mongoClient.getDatabase("test");
System.out.println("MongoDatabase inof is: " + mgdb.getName()); // show collections
MongoIterable<String> names = mgdb.listCollectionNames();
for (String name : names) {
System.out.println(name);
}
} catch (Exception e) {
} finally {
mongoClient.close();
}

MongoClient是具有内部连接池的MongoDB客户端。对于大多数应用程序,整个JVM有一个MongoClient对象就可以了。

在示例代码中使用了传入IP、端口的构造方法创建了MongoClient对象。

以下是等效的,都连接到默认端口上运行的本地数据库:

 MongoClient mongoClient1 = new MongoClient();
MongoClient mongoClient1 = new MongoClient("localhost");
MongoClient mongoClient2 = new MongoClient("localhost", 27017);
MongoClient mongoClient4 = new MongoClient(new ServerAddress("localhost"));
MongoClient mongoClient5 = new MongoClient(new ServerAddress("localhost"), MongoClientOptions.builder().build());

也可以通过将ServerAddress列表传递给MongoClient构造函数来连接副本集。例如:

 MongoClient mongoClient = new MongoClient(Arrays.asList(
new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));

还可以使用相同的构造方法连接到分片群集。MongoClient将自动检测服务器是否是副本集成员列表或mongos服务器列表。

示例代码中使用了获取全部数据库名称列表和切换数据库的方法

a. 可以使用getDatabase("test")方法获取指定数据库,此方法返回一个MongoDatabase对象即当前数据库

b. 可以使用listDatabaseNames()获取全部数据库

 // show dbs
MongoIterable<String> databaseNames = mongoClient.listDatabaseNames();
for (String name : databaseNames) {
System.out.println(name);
}

3、创建和列出集合

 MongoClient mongoClient = null;

 try {

     mongoClient = new MongoClient("10.10.12.195", 27017);

     // 连接test库
MongoDatabase mgdb = mongoClient.getDatabase("test"); // 创建employee集合
mgdb.createCollection("employee");
System.out.println("Create collection: employee"); // show collections
MongoIterable<String> names = mgdb.listCollectionNames();
for (String name : names) {
System.out.println(name);
} } catch (Exception e) {
} finally {
mongoClient.close();
}

MongoDatabase类的createCollection("name")可以创建指定名称的集合

MongoDatabase还有一些其他方法,此处列出主要的:

 MongoCollection<Document> getCollection(String collectionName);
MongoIterable<String> listCollectionNames();
ListCollectionsIterable<Document> listCollections();
void createCollection(String collectionName);
void createCollection(String collectionName, CreateCollectionOptions createCollectionOptions);

4、文档的插入、查询和删除

 MongoClient mongoClient = null;

 try {

     mongoClient = new MongoClient("10.10.12.195", 27017);

     // 连接test库
MongoDatabase mgdb = mongoClient.getDatabase("test"); // 获取集合
MongoCollection<Document> emps = mgdb.getCollection("employee"); // 创建文档
Document document = new Document().append("name", "administrator").append("age", 20); // 插入文档
emps.insertOne(document); // 查询数据量
long rows = emps.count();
System.out.println(rows);
// 查询全部数据
FindIterable<Document> find = emps.find();
for (Document d : find) {
Set<String> set = d.keySet();
for (String k : set) {
System.out.println(k + ": " + d.get(k));
}
} // 删除数据
emps.deleteMany(new BsonDocument()); } catch (Exception e) {
} finally {
mongoClient.close();
}

MongoDatabase的getCollection("employee")方法可以获取指定名称的集合即MongoCollection<Document>对象

调用insertOne方法即可向集合中插入一个文档Document对象

看下文档的创建,链式语法,可以使用append方法向文档中添加字段和值

Document document = new Document().append("name", "administrator").append("age", 20);

MongoCollectionfind()方法可以查询集合全部数据

 // 查询全部数据
FindIterable<Document> find = emps.find();
for (Document d : find) {
Set<String> set = d.keySet();
for (String k : set) {
System.out.println(k + ": " + d.get(k));
}
}

有一个重载的 find(Bson filter) 可以查询指定条件的数据,在更新示例中会介绍Bson 的使用方法

删除数据

emps.deleteMany(new BsonDocument());

类似find方法,删除数据时也可以传入一个Bson对象指定过滤条件

5、文档更新、Bson和Filters工具类

 // 获取集合
MongoCollection<Document> emps = mgdb.getCollection("employee"); // 创建文档
Document document = new Document().append("name", "administrator").append("age", 20); // 插入文档
emps.insertOne(document); // 更新数据
emps.updateOne(Filters.eq("name", "administrator"), new Document("$set", new Document("name", "administrator2")));

我们此处使用了updateOne方法更新了一条数据,该方法接收两个参数:第一个参数是Bson对象设置查询条件;第二个参数是一个文档对象指定如何更新数据。

Bson接口通常用于条件过滤,我们可以使用Filters工具类来快速的构建条件。

Filters工具类是一个用于构建查询过滤器的工厂。使用此类的一种便捷方法是静态导入其所有方法,允许使用如下:

collection.find(and(eq("x", 1), lt("y", 3)));

有很多静态方法可以使用:

6、连接池特性

Mongo实例就是一个数据库连接池,默认有10个链接。没有必要重新实现这个连接池,但是可以更改配置。所以,项目中最好只存在一个Mongo的实例。
MongoClientOptions.Builder.connectionsPerHost(int)设置每个主机的最大连接数
MongoClientOptions.Builder.threadsAllowedToBlockForConnectionMultiplier(int)设置线程队列数,与上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误
MongoClientOptions.Builder.maxWaitTime(int)设置最大等待连接的线程阻塞时间
MongoClientOptions.Builder.connectTimeout(int)设置连接超时的毫秒。0是默认和无限
MongoClientOptions.Builder.socketTimeout(int)设置socket超时。0是默认和无限

还有很多,详细在MongoClientOptions类

MongoDB和Java(3):Java操作MongoB的更多相关文章

  1. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  2. [转]MongoDB for Java】Java操作MongoDB

    原文地址: MongoDB for Java]Java操作MongoDB 开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开 ...

  3. Mongodb入门并使用java操作Mongodb

    转载请注意出处:http://blog.csdn.net/zcm101 最近在学习NoSql,先从Mongodb入手,把最近学习的总结下. Mongodb下载安装 Mongodb的下载安装就不详细说了 ...

  4. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  5. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

  6. Java读写文本文件操作

    package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

  7. 第26章 java进制操作

    java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...

  8. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  9. Java api 入门教程 之 JAVA的文件操作

    I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本 ...

随机推荐

  1. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  2. javascript正则提取字母和数字小数

    var item = {name:"PM2.5"}; item.nameFirst = item.name.replace(/[^a-zA-Z]/g, ''); item.name ...

  3. openssl 自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书

    server { listen 80; listen 443 ssl; server_name ~^((cloud)|(demo-cloud)|(demo2-cloud)|(approval1))(( ...

  4. pandas连接多个表格concat()函数

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  5. mysql原生sql处理,按逗号拆分列为多行

    举例: id value 1 1,2,3,4 2 2,3,4,5,6 拆分成: id value 1 1 2 2 3 3 4 4 5 5 6 6 ),) ) distinct:去重复操作 a.valu ...

  6. 关于使用sudo找不到环境变量的问题

    参考这里:https://www.cnblogs.com/zhongshiqiang/p/10839666.html 使用sudo -E 保留当前用户环境,这时就不会存在找不到环境变量的问题了.

  7. 阿里云OSS设置跨域访问 H5的时候

    OSS 提供 HTML5 协议中的跨域资源共享 CORS 设置,帮助您实现跨域访问.当 OSS 收到一个跨域请求(或者 OPTIONS 请求)时,会读取存储空间对应的 CORS 规则,然后进行相应的权 ...

  8. Java基础 awt Frame 窗体的大小不可调

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  9. nodejs命令行执行时带参数

    nodejs命令行执行时带参数 转 https://www.jianshu.com/p/474e6d76f867   今天项目里突然想在初始化时跑一些数据,于是想起以前在python时可以在命令行里带 ...

  10. Mac安装MySQL-python的血泪史

    现象描述 起初正常使用pip命令提示如下的错误: cc -bundle -undefined dynamic_lookup -Wl,-F. build/temp.macosx-10.14-intel- ...