Java语言操作MongoDB
-
使用场景
数据量级非常大
数据非常复杂,嵌套比较多,比如涉及评论的网站,论坛,博客
-
MongoDB依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
- 使用Java实现MongoDB增删改查
package com.java.mongodb.test;
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 org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
/**
* @author Liushun
* @date Created in 2019/8/20 14:23
* @description MongoDB数据库的操作测试类
*/
public class MongoDBTest01 {
// 客户端
private MongoClient client = null;
// MongoDB的数据库中的集合连接对象
private MongoCollection<Document> bookCollection = null;
// 连接到MongoDB的数据库,连接到具体的集合
@Before
public void init(){
// 1.连接到客户端
client = new MongoClient("127.0.0.1",27017);
// 2.连接到具体的操作的库
MongoDatabase db = client.getDatabase("zhiheng");
// 3.连接到库中具体操作的集合
bookCollection = db.getCollection("books");
}
@After
public void close(){
// 测试完成后关闭客户端的连接
client.close();
}
// 测试查询集合中的数据
@Test
public void test01(){
// 执行查询数据
FindIterable<Document> documents = bookCollection.find();
// 进行分页查询
documents.skip(0).limit(6);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
// 根据条件author="施耐庵"进行查询
@Test
public void test02(){
// 设置查询的条件
Document parDoc = new Document();
parDoc.append("author","施耐庵");
// 执行查询数据
FindIterable<Document> documents = bookCollection.find(parDoc);
// 进行分页查询
documents.skip(0).limit(6);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
// 根据条件author="施耐庵"进行查询
@Test
public void test03(){
// 设置查询条件
Document parDoc = new Document(Document.parse("{'author':'施耐庵'}"));
// 执行查询数据
FindIterable<Document> documents = bookCollection.find(parDoc);
// 进行分页查询
documents.skip(0).limit(6);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
// 查询bname中以a结尾的所有数据,不区分大小写,价格区间为90-100
@Test
public void test04(){
// String里面的格式为"{直接粘贴MongoDB语句}"
String parStr = "{" +
"\"bname\":{$regex:/a$/i},\n" +
" $and:[\n" +
" {\"price\":{$gte:90}},\n" +
" {\"price\":{$lte:100}}\n" +
" ]" +
"}";
// 设置查询条件
Document parDoc = new Document(Document.parse(parStr));
// 执行查询数据
FindIterable<Document> documents = bookCollection.find(parDoc);
// 进行分页查询
documents.skip(0).limit(6);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
// 添加单条数据
@Test
public void test05(){
// 添加的文档数据
String insDoc = "{'bname':'大学','author':'曾参','price':118.9,'counts':120}";
// 新建添加的文档对象
Document document = new Document(Document.parse(insDoc));
// 执行单个添加
bookCollection.insertOne(document);
}
// 添加多个数据
@Test
public void test06(){
// 添加的文档数据
String insDoc1 = "{'bname':'大学1','author':'曾参','price':118.9,'counts':120}";
// 新建添加的文档对象
Document document1 = new Document(Document.parse(insDoc1));
// 添加的文档数据
String insDoc2 = "{'bname':'大学2','author':'曾参','price':118.9,'counts':120}";
// 新建添加的文档对象
Document document2 = new Document(Document.parse(insDoc2));
// 添加的文档数据
String insDoc3 = "{'bname':'大学3','author':'曾参','price':118.9,'counts':120}";
// 新建添加的文档对象
Document document3 = new Document(Document.parse(insDoc3));
// 执行添加多个
bookCollection.insertMany(Arrays.asList(document1,document2,document3));
}
// 通过循环添加多条数据
@Test
public void test07(){
// 开始时间
long startTime = System.currentTimeMillis();
for (int i =1; i <= 100000; i++){
// 新建添加的文档
Document insDoc = new Document();
insDoc.append("bname","zhiheng"+ i);
insDoc.append("author","niubi");
insDoc.append("price",i);
insDoc.append("counts",i);
bookCollection.insertOne(insDoc);
}
// 结束时间
long endTime = System.currentTimeMillis();
System.out.println("共消耗" + (endTime - startTime) / 1000 + "s");
}
// 测试条件删除
@Test
public void test08(){
// 开始时间
long startTime = System.currentTimeMillis();
// 新建删除的条件
Document delDoc = new Document(Document.parse("{'author':'niubi'}"));
bookCollection.deleteMany(delDoc);
// 结束时间
long endTime = System.currentTimeMillis();
System.out.println("共消耗" + (endTime - startTime) / 1000 + "s");
}
// 修改单个数据
@Test
public void test09(){
// 修改的条件和内容
String updDocStr1 = "{'author':'施耐庵'}";
String updDocStr2 = "{$set:{'price':99}}";
// 新建修改的文档内容
Document updDoc1 = new Document(Document.parse(updDocStr1));
Document updDoc2 = new Document(Document.parse(updDocStr2));
// 执行修改
bookCollection.updateOne(updDoc1,updDoc2);
}
// 修改多个数据
@Test
public void test10(){
// 修改的条件和内容
String updDocStr1 = "{'author':'施耐庵'}";
String updDocStr2 = "{$set:{'price':98}}";
// 新建修改的文档内容
Document updDoc1 = new Document(Document.parse(updDocStr1));
Document updDoc2 = new Document(Document.parse(updDocStr2));
// 执行修改
bookCollection.updateMany(updDoc1,updDoc2);
}
// 通过Bson作为条件进行查询
@Test
public void test11(){
// 新建条件查询
Bson gteBson = Filters.gte("price", 90);
Bson lteBson = Filters.lte("price", 100);
Bson andBson = Filters.and(gteBson, lteBson);
// 执行查询
FindIterable<Document> documents = bookCollection.find(andBson);
// 进行分页查询
documents.skip(0).limit(6);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
// 通过Bson作为条件进行查询
@Test
public void test12(){
// 新建查询的条件
Bson ltBson = Filters.lt("price", 100);
Bson regexBson = Filters.regex("bname", "/a/i");
Bson orBson = Filters.or(ltBson,regexBson);
// 执行查询
FindIterable<Document> documents = bookCollection.find(orBson);
// 进行分页查询
documents.skip(0).limit(10);
// 将查询的数据进行遍历输出
documents.iterator().forEachRemaining(temp-> System.out.println(temp));
}
}