MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。
MongoDB使用文档的方式存储数据,而且非常容易进行分库分表的操作。在Spring Boot中集成mongdb非常简单,只需要在新建项目的时候勾选mongdb一项即可,使用起来也足够简单。但是由于使用时很简单也造成其不够灵活的特点,因此我们需要自己实现一个可以分库分表的mongdb操作代码。
- 首先在pom.xml中引入mongdb依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</dependency>
- mongdb是一种非关系型数据库,因此使用java连接的话也需要一些身份认证,在application.yml中加入配置信息:
xyh:
mongodb:
URI: mongodb://test:test123@127.0.0.1/
dataBase: comment
注意:以上配置所用到的都是我们自己定义的变量名,127.0.0.1为本机地址,因此需要你额外安装mongdb
- 有了配置之后就需要用代码去读取这些配置了,新建MongoDBManager.java类用于读取配置信息:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
/**
* MongoDB管理器
*/
@Component
public class MongoDBManager {
/**
* URI
*/
@Value("${xyh.mongodb.URI}")
private String uri;
/**
* URI
*/
@Value("${xyh.mongodb.dataBase}")
private String dataBase;
/**
* 获取 MongoClient 对象,可以只创建一个
*
* @return MongoClient对象
*/
@Bean
public MongoClient mongoClient() {
System.out.println("\n\n\n\n\n" + uri + dataBase);
return new MongoClient(new MongoClientURI(uri + dataBase));
}
public String getDataBase() {
return dataBase;
}
public void setDataBase(String dataBase) {
this.dataBase = dataBase;
}
}
- 接下来就是对mongdb的实际操作了,首先我们新建一个Writer.java类用于对mongdb进行写操作。相当于mysql中的
insert
和update
。
package hys.mongodb.manage;
import com.alibaba.fastjson.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import xyh.mongodb.utils.BsonTool;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.UUID;
@Repository
public class Writer {
@Resource
private MongoClient mongoClient;
/**
* 数据存储
*
* @param dataBase 数据库
* @param collect 业务代码,一个业务代码对应一个数据集
* @param data 存储的数据
*/
public void insert(String dataBase, String collect, JSONObject data) {
JSONObject jso = new JSONObject();
jso.putAll(data);
if (jso.getString("id") == null) {
String id = BsonTool.uuid();
jso.put("id", id);
}
MongoCollection<Document> collection = getCollection(dataBase, collect);
collection.insertOne(Document.parse(jso.toJSONString()));
}
/**
*
* @param dataBase 数据库
* @param collect 集合
* @param filter 过滤条件
* @param update 更新对象
*/
public boolean update(String dataBase, String collect, Bson filter, Bson update) {
MongoCollection collection = getCollection(dataBase, collect);
UpdateResult ur = collection.updateOne(filter, update);
return ur.getModifiedCount() > 0;
}
/**
* 当数据存在时更新数据,数据不存在时插入数据
* @param dataBase
* @param collect
* @param filter
* @param update
* @return
*/
public boolean upsert(String dataBase, String collect, Bson filter, Bson update) {
MongoCollection collection = getCollection(dataBase, collect);
//UpdateResult ur = collection.updateOne(filter, update);
UpdateResult ur = collection.replaceOne(filter, update, new UpdateOptions().upsert(true));
//UpdateResult ur = collection.updateOne(filter, update, new UpdateOptions().upsert(true));
return ur.getModifiedCount() > 0;
}
/**
* 删除文档
* @param dataBase
* @param collect
* @param filter
*/
public boolean delete(String dataBase, String collect, Bson filter) {
MongoCollection collection = getCollection(dataBase, collect);
DeleteResult dr = collection.deleteOne(filter);
return dr.getDeletedCount() > 0;
}
private MongoCollection getCollection(String dataBase, String collect) {
MongoDatabase db = mongoClient.getDatabase(dataBase);
return db.getCollection(collect);
}
}
Writer类中向外暴露了四个方法,基本上可以满足常规的增删改操作。
- 然后我们新建一个Reader.java类用于对mongdb进行读操作,相当于mysql中的
select
。
import com.alibaba.fastjson.JSONObject;
import com.mongodb.*;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import xyh.mongodb.beans.Comment;
import xyh.mongodb.beans.Pager;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Repository
public class Reader {
@Resource
private MongoClient mongoClient;
/**
* 数据存储
*
* @param dataBase 数据库
* @param collect 业务代码,一个业务代码对应一个数据集
*/
public <T> List<T> read(String dataBase, String collect, Bson cnd, Pager pager, Class<T> clazz) {
final List<T> results = new ArrayList<>();
Block<Document> iteratorResults = document -> {
JSONObject jo = new JSONObject(document);
results.add(JSONObject.toJavaObject(jo, clazz));
};
MongoDatabase db = mongoClient.getDatabase(dataBase);
MongoCollection<Document> collection = db.getCollection(collect);
if (pager == null) {
//排序以及查询条件
collection.find(cnd).sort(new BasicDBObject("insTime", 1))
.forEach(iteratorResults);
} else {
collection.find(cnd).sort(new BasicDBObject("insTime", 1))
.skip((pager.getPageNumber() - 1) * pager.getPageSize())
.limit(pager.getPageSize())
.forEach(iteratorResults);
}
return results;
}
/**
* 返回总数
*
* @param dataBase 企业Id
* @param collect 业务代码,一个业务代码对应一个数据集
*/
public long count(String dataBase, String collect, Bson cnd) {
MongoDatabase db = mongoClient.getDatabase(dataBase);
MongoCollection<Document> collection = db.getCollection(collect);
if (cnd == null) {
return collection.count();
} else {
return collection.count(cnd);
}
}
/**
* 查询一个
*/
public Document findOne(String dataBase, String collect, Bson bson) {
return mongoClient.getDatabase(dataBase).getCollection(collect).find(bson).first();
}
}
Reader类中向外暴露了三个方法,基本上可以满足常规的查询操作。
注意其中的两行代码:
MongoDatabase db = mongoClient.getDatabase(dataBase)
MongoCollection<Document> collection = db.getCollection(collect)
由于mongdb的结构是一个dataBase下有很多个collection,每个collection下又有很多个document,其中每一个document相当于一条数据。我们在查询mongdb的时候每次都是动态的去获取dataBase和collection,依靠这两句可以轻松的在mongdb中实现分库分表。
有了这两个操作mongdb基本的类之后,我们只需要调用这两个类中的相应方法就可以实现mongdb的增删改查了。
在mongdb中都是对Bson
进行操作,而每个Bson
的实现类又会去实现Map
,所以mongdb中存储的都是类似于json格式的数据。
看下面的代码:
//调用reader类中的findOne方法,并将dataBase和collection传入(如果不想传dataBase和collection的话可以在初始化的时候写死),
//并且新建一个文档作为查询条件
reader.findOne(manager.getDataBase(), COMMENT + bizName, new Document("id", id));
看下面的代码:
// 新建一个文档用于更新
Document newDocument = new Document().append("$inc", new Document().append("lkNum", 1));
//新建一个文档用于查询
Document filter = new Document();
//查询条件
filter.put("id", id);
//调用刚刚writer类中的update方法,并将dataBase和collection传入,并将更新的文档和查询条件传入。
boolean updateCount = writer.update(manager.getDataBase(), COMMENT + bizName, filter, newDocument);
以上就是mongdb的增删改查操作。