MongoDB是專為可擴(kuò)展性床佳,高性能和高可用性而設(shè)計(jì)的數(shù)據(jù)庫(kù)怕品。它可以從單服務(wù)器部署擴(kuò)展到大型峡钓、復(fù)雜的多數(shù)據(jù)中心架構(gòu)槐雾。利用內(nèi)存計(jì)算的優(yōu)勢(shì)夭委,MongoDB能夠提供高性能的數(shù)據(jù)讀寫操作。
MongoDB使用文檔的方式存儲(chǔ)數(shù)據(jù)募强,而且非常容易進(jìn)行分庫(kù)分表的操作株灸。在Spring Boot中集成mongdb非常簡(jiǎn)單,只需要在新建項(xiàng)目的時(shí)候勾選mongdb一項(xiàng)即可擎值,使用起來(lái)也足夠簡(jiǎn)單慌烧。但是由于使用時(shí)很簡(jiǎn)單也造成其不夠靈活的特點(diǎn),因此我們需要自己實(shí)現(xiàn)一個(gè)可以分庫(kù)分表的mongdb操作代碼鸠儿。
- 首先在pom.xml中引入mongdb依賴:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</dependency>
- mongdb是一種非關(guān)系型數(shù)據(jù)庫(kù)屹蚊,因此使用java連接的話也需要一些身份認(rèn)證厕氨,在application.yml中加入配置信息:
xyh:
mongodb:
URI: mongodb://test:test123@127.0.0.1/
dataBase: comment
注意:以上配置所用到的都是我們自己定義的變量名,127.0.0.1為本機(jī)地址汹粤,因此需要你額外安裝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 對(duì)象,可以只創(chuàng)建一個(gè)
*
* @return MongoClient對(duì)象
*/
@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;
}
}
- 接下來(lái)就是對(duì)mongdb的實(shí)際操作了玄括,首先我們新建一個(gè)Writer.java類用于對(duì)mongdb進(jìn)行寫操作冯丙。相當(dāng)于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;
/**
* 數(shù)據(jù)存儲(chǔ)
*
* @param dataBase 數(shù)據(jù)庫(kù)
* @param collect 業(yè)務(wù)代碼遭京,一個(gè)業(yè)務(wù)代碼對(duì)應(yīng)一個(gè)數(shù)據(jù)集
* @param data 存儲(chǔ)的數(shù)據(jù)
*/
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 數(shù)據(jù)庫(kù)
* @param collect 集合
* @param filter 過(guò)濾條件
* @param update 更新對(duì)象
*/
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;
}
/**
* 當(dāng)數(shù)據(jù)存在時(shí)更新數(shù)據(jù),數(shù)據(jù)不存在時(shí)插入數(shù)據(jù)
* @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類中向外暴露了四個(gè)方法泞莉,基本上可以滿足常規(guī)的增刪改操作哪雕。
- 然后我們新建一個(gè)Reader.java類用于對(duì)mongdb進(jìn)行讀操作,相當(dāng)于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;
/**
* 數(shù)據(jù)存儲(chǔ)
*
* @param dataBase 數(shù)據(jù)庫(kù)
* @param collect 業(yè)務(wù)代碼斯嚎,一個(gè)業(yè)務(wù)代碼對(duì)應(yīng)一個(gè)數(shù)據(jù)集
*/
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;
}
/**
* 返回總數(shù)
*
* @param dataBase 企業(yè)Id
* @param collect 業(yè)務(wù)代碼,一個(gè)業(yè)務(wù)代碼對(duì)應(yīng)一個(gè)數(shù)據(jù)集
*/
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);
}
}
/**
* 查詢一個(gè)
*/
public Document findOne(String dataBase, String collect, Bson bson) {
return mongoClient.getDatabase(dataBase).getCollection(collect).find(bson).first();
}
}
Reader類中向外暴露了三個(gè)方法挨厚,基本上可以滿足常規(guī)的查詢操作堡僻。
注意其中的兩行代碼:
MongoDatabase db = mongoClient.getDatabase(dataBase)
MongoCollection<Document> collection = db.getCollection(collect)
由于mongdb的結(jié)構(gòu)是一個(gè)dataBase下有很多個(gè)collection,每個(gè)collection下又有很多個(gè)document疫剃,其中每一個(gè)document相當(dāng)于一條數(shù)據(jù)钉疫。我們?cè)诓樵僲ongdb的時(shí)候每次都是動(dòng)態(tài)的去獲取dataBase和collection,依靠這兩句可以輕松的在mongdb中實(shí)現(xiàn)分庫(kù)分表巢价。
有了這兩個(gè)操作mongdb基本的類之后牲阁,我們只需要調(diào)用這兩個(gè)類中的相應(yīng)方法就可以實(shí)現(xiàn)mongdb的增刪改查了。
在mongdb中都是對(duì)Bson
進(jìn)行操作壤躲,而每個(gè)Bson
的實(shí)現(xiàn)類又會(huì)去實(shí)現(xiàn)Map
城菊,所以mongdb中存儲(chǔ)的都是類似于json格式的數(shù)據(jù)。
看下面的代碼:
//調(diào)用reader類中的findOne方法碉克,并將dataBase和collection傳入(如果不想傳dataBase和collection的話可以在初始化的時(shí)候?qū)懰溃?//并且新建一個(gè)文檔作為查詢條件
reader.findOne(manager.getDataBase(), COMMENT + bizName, new Document("id", id));
看下面的代碼:
// 新建一個(gè)文檔用于更新
Document newDocument = new Document().append("$inc", new Document().append("lkNum", 1));
//新建一個(gè)文檔用于查詢
Document filter = new Document();
//查詢條件
filter.put("id", id);
//調(diào)用剛剛writer類中的update方法凌唬,并將dataBase和collection傳入,并將更新的文檔和查詢條件傳入漏麦。
boolean updateCount = writer.update(manager.getDataBase(), COMMENT + bizName, filter, newDocument);
以上就是mongdb的增刪改查操作客税。