使用MongoClient連接Mongodb問題
MongoClient連接Mongodb
使用
pom文件引入依賴
在pom文件中引入客服端依賴
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.6.0</version> </dependency>
配置相關(guān)信息
在無密碼情況下,使用MongoClient直接建立連接,僅需提供IP、端口信息。
MongoClient client = new MongoClient("127.0.0.1",27017);
在需要密碼的情況下,使用MongoCredential配置密碼信息,使用ServerAddress配置服務(wù)信息。
ServerAddress serverAddress = new ServerAddress("192.168.1.55", 27017); MongoCredential mongoCredential = MongoCredential.createCredential("admin", "admin", "123456".toCharArray()); // 第一個(gè)"admin" 為賬號(hào),第二個(gè)"admin"為創(chuàng)建賬戶時(shí)的數(shù)據(jù)庫(kù)名稱,第三個(gè)參數(shù)為密碼 MongoClient mongoClient = new MongoClient(serverAddress,mongoCredential, MongoClientOptions.builder().build()); // MongoClientOptions 是連接的相關(guān)配置,類似數(shù)據(jù)庫(kù)連接池的相關(guān)配置,使用默認(rèn)即可
開啟連接,訪問數(shù)據(jù)
調(diào)試運(yùn)行,檢查是否報(bào)錯(cuò),如果賬戶密碼都正確,提示鑒權(quán)失敗,可能是配置鑒權(quán)的第二個(gè)參數(shù)設(shè)置不對(duì)
import com.mongodb.*; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; /** * @author Ryan * @version 1.0 * @date 2021/9/6 */ public class MongoDemo { public static void main(String[] args) { ServerAddress serverAddress = new ServerAddress("192.168.1.55", 27017); MongoCredential mongoCredential = MongoCredential.createCredential("admin", "admin", "123456".toCharArray()); MongoClient mongoClient = new MongoClient(serverAddress,mongoCredential, MongoClientOptions.builder().build()); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("survey"); System.out.println(collection.find().first()); } }
運(yùn)行結(jié)果:
16:57:24.124 [cluster-ClusterId{value='6135d7f32719bd3878607cbd', description='null'}-192.168.1.55:27017] DEBUG org.mongodb.driver.cluster - Updating cluster description to {type=STANDALONE, servers=[{address=192.168.1.55:27017, type=STANDALONE, roundTripTime=5.9 ms, state=CONNECTED}]
16:57:24.184 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2, serverValue:136}] to 192.168.1.55:27017
16:57:24.193 [main] DEBUG org.mongodb.driver.protocol.command - Sending command {find : BsonString{value='survey'}} to database test on connection [connectionId{localValue:2, serverValue:136}] to server 192.168.1.55:27017
16:57:24.200 [main] DEBUG org.mongodb.driver.protocol.command - Command execution completed
Document{{_id=6135b83698a8ae31e4cec754, name=a, date=Fri Feb 19 08:00:00 CST 2016, results=[Document{{product=abc, score=10.0}}, Document{{product=xyz, score=5.0}}]}}
mongodb java客戶端的使用,即MongoClient
Java 連接 MongoDB
MongoDB 提供了一系列的驅(qū)動(dòng)用于支持各種語(yǔ)言連接 mongodb 數(shù)據(jù)庫(kù),包括:Java,Python,C++,Scala,PHP 等,完整的驅(qū)動(dòng)列表:
https://docs.mongodb.com/manual/applications/drivers/index.html
其中對(duì)于 Java 提供了 mongo-java-driver 庫(kù)支持 Mongo JDBC 驅(qū)動(dòng),使用該驅(qū)動(dòng)只要在項(xiàng)目依賴中導(dǎo)入:org.mongodb:mongo-java-driver
如在使用 gradle 構(gòu)建的項(xiàng)目中,如下導(dǎo)入:
compile 'org.mongodb:mongo-java-driver:3.6.3'
Mongo JDBC 驅(qū)動(dòng)文檔主頁(yè):http://mongodb.github.io/mongo-java-driver/;
可以在驅(qū)動(dòng)主頁(yè)查詢?cè)擈?qū)動(dòng)的詳細(xì)用法,一下示例基本使用,包括:數(shù)據(jù)庫(kù)連接、CURD 操作,使用版本為:mongodb 3.6,mongo-java-driver 3.6,不同版本的驅(qū)動(dòng)的 API 由一些差異,詳細(xì)請(qǐng)查詢驅(qū)動(dòng)文檔;
示例用的數(shù)據(jù)庫(kù)集合 testdb.blog 文檔示例如下:
{ "_id" : ObjectId("5a8d519a07c9086ee823f15d"), "title" : "Mysql Overview", "description" : "Musql is a RDBMS", "author" : "assad", "url" : "http://blog.assad.article/233", "tages" : [ "mysql", "RDBMS", "sql" ], "likes" : 200 }
數(shù)據(jù)庫(kù)連接
1)無驗(yàn)證連接
MongoClient mongoClient = new MongoClient("127.0.0.1",27017); //或者使用 mongo uri MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017"));
2)驗(yàn)證連接
String user = "assad"; //用戶名 String database = "testdb"; //數(shù)據(jù)庫(kù) char[] password = "123".toCharArray(); //密碼 ? MongoCredential credential = MongoCredential.createCredential(user,database,password); //驗(yàn)證對(duì)象 MongoClientOptions options = MongoClientOptions.builder().sslEnabled(false).build(); //連接操作對(duì)象 MongoClient mongoClient = new MongoClient(new ServerAddress("127.0.0.1",27017),credential,options); //連接對(duì)象 ? //或者使用 mongo uri MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:123@127.0.0.1:27017/?authSource=testdb&ssl=false")); 其中 mongo uri 的驗(yàn)證連接格式如下: mongodb://userName:password@host/?authSource=databaseName&ssh=true;
獲取數(shù)據(jù)庫(kù) & 集合
//獲取指定數(shù)據(jù)庫(kù)對(duì)象 MongoDatabase db = mongoClient.getDatabase("testdb"); //獲取指定集合對(duì)象 MongoCollection<Document> blogs = db.getCollection("blog"); ? //列舉所有數(shù)據(jù)庫(kù)名稱 for(String dbName : blogs.listDatabaseNames() System.out.println(dbName); //列舉指定數(shù)據(jù)庫(kù)中所有集合名稱 for(String colName: db.listCollectionNames()) System.out.println(colName);
以下示例中,對(duì)于文檔結(jié)果的輸出都使用 Log4j2 進(jìn)行標(biāo)準(zhǔn)輸出;
select 查詢操作
1)查詢結(jié)果遍歷
在 MongoDB JDBC 中,會(huì)對(duì)查詢結(jié)果生成一個(gè) FindIterable<Document> 對(duì)象,可以通過獲取其迭代器對(duì)其進(jìn)行迭代,同時(shí)該對(duì)象也提供了 foreach 方法,通過傳入一個(gè) Block 對(duì)象,可以對(duì)結(jié)果進(jìn)行阻塞迭代;
//數(shù)據(jù)庫(kù)連接 MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:123@127.0.0.1:27017/?authSource=testdb&ssl=false")); MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog"); ? //查詢所有文檔,遍歷輸出結(jié)果 for (Document document1 : blogs.find()) log.debug(document1.toJson()); ? //查詢所有文檔,使用遍歷器遍歷結(jié)果 MongoCursor<Document> cursor = blogs.find().iterator(); while(cursor.hasNext()) log.debug(cursor.next().toJson()); ? //查詢所有文檔,對(duì)所有結(jié)果使用阻塞回調(diào)方法 blogs.find().forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? //查詢所有文檔,獲取結(jié)果文檔中的 title 字段(string)、likes 字段(int32)、tags 字段(array) blogs.find().forEach((Block<Document>) document ->{ String title = document.getString("title"); int likes = document.getInteger("likes"); List<String> tags = (List<String>) document.get("tags"); log.debug(title + " - " + likes + " - " + tags); });
2)條件查詢
對(duì)于條件查詢,可以通過構(gòu)造一個(gè)個(gè)嵌套的 Document 對(duì)象,產(chǎn)生類似 mongodb 查詢語(yǔ)法的 Document 鏈來進(jìn)行查詢;或者使用 Filters 中的各種靜態(tài)方法(如 eq,lte等)來進(jìn)行函數(shù)式地查詢,MongoDB JDBC 已經(jīng)將絕大部分的 mongodb 查詢條件操作符封裝為函數(shù)式調(diào)用;
//條件查詢: db.blog.find({"author":"assad"}) blogs.find(new Document("author","assad")).forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? blogs.find(eq("author","assad")).forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? ? //條件查詢: db.blog.find({"likes":{$gte:200,$lte:500}}) blogs.find(new Document("likes",new Document("$gte",200).append("$lte",500))) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); blogs.find(and(gte("likes",200), lte("likes",500))) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? //條件查詢:db.blog.find({"author":"assad","title":/mongodb*/i }) blogs.find(new Document("author","assad").append("title",new Document("$regex","mongodb*").append("$options","i"))) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); blogs.find(and(eq("author","assad"), regex("title","mongodb*","i"))) .forEach((Block<Document>) document -> { log.debug(document.toJson()); });
3)查詢結(jié)果映射,排序,限制
//映射操作, db.blog.find({"author:"assad""},{"title":1,"url":1,"likes":1,"_id":0}) blogs.find(new Document("author","assad")) .projection(new Document("title",1).append("url",1).append("likes",1).append("_id",0)) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); blogs.find(eq("author","assad")) .projection(fields(include("title","url","likes"),excludeId())) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? //查詢排序、限制: db.blog.find().sort({"likes":1,"title":-1}).limit(5) blogs.find() .sort(and(ascending("likes"),descending("title"))) .limit(5) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? blogs.find() .sort(new Document("likes",1).append("title",-1)) .limit(5) .forEach((Block<Document>) document -> { log.debug(document.toJson()); });
4)aggregate 數(shù)據(jù)聚合操作
//數(shù)據(jù)聚合: db.blog.aggregate([ {$group:{_id:"$author",likes_count:{$sum:"$likes"}}} ]) blogs.aggregate(asList( group("$author",sum("likes_count","$likes")) )) .forEach((Block<Document>) document -> { log.debug(document.toJson()); }); ? //數(shù)據(jù)聚合: db.blog.aggregate([ {$group:{_id:"$author",likes_avg:{$avg:"$likes"}}}, {$match:{_id:"assad"}} ]) blogs.aggregate(asList( group("$author",avg("likes_avg","$likes")), match(eq("_id","assad")) )) .forEach((Block<Document>) document -> { log.debug(document.toJson()); });
insert 插入操作
//數(shù)據(jù)庫(kù)連接 MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:123@127.0.0.1:27017/?authSource=testdb&ssl=false")); MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog"); ? //插入一個(gè)文檔 Document doc = new Document("title","Mysql Overview") .append("description","Musql is a RDBMS") .append("author","assad") .append("url","http://blog.assad.article/233") .append("tages", Arrays.asList("mysql","RDBMS","sql")) .append("likes",100); blogs.insertOne(doc); ? //插入多個(gè)文檔 Document doc1 = new Document("title","DB2 Overview") .append("author","Alex"); Document doc2 = new Document("title","Redis Overview") .append("author","Orlda"); List<Document> docList = new ArrayList<>(); docList.add(doc1); docList.add(doc2); blogs.insertMany(docList);
?
update 操作
//數(shù)據(jù)庫(kù)連接 MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:123@127.0.0.1:27017/?authSource=testdb&ssl=false")); MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog"); ? //更改第一條匹配條件的文檔記錄,對(duì)應(yīng) update(<query>,{muti:false}) 方法 blogs.updateOne(and(eq("author","assad"),eq("title","SqlLite Overview")) ,combine(set("author","assad_1"),set("likes",0))); ? //更改所有匹配條件的文檔記錄,對(duì)應(yīng) update(<query>,{muti:true}) 方法 blogs.updateMany(lte("likes",300) , inc("likes",100)); ? ? //完全替換一條文檔記錄,對(duì)應(yīng) save() 方法 Document doc = new Document("title","Mysql Overview") .append("description","Musql is a RDBMS") .append("author","assad") .append("url","http://blog.assad.article/233") .append("tages", Arrays.asList("mysql","RDBMS","sql")) .append("likes",100); blogs.replaceOne(eq("author","Alex"),doc);
?
delete 操作
//數(shù)據(jù)庫(kù)連接 MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:123@127.0.0.1:27017/?authSource=testdb&ssl=false")); MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog"); ? //刪除第一條滿足查詢條件的文檔記錄,對(duì)應(yīng) delete(<query>,{justOne:true}) 方法 blogs.deleteOne(eq("author","Alex")); ? //刪除所有滿足查詢條件的文檔記錄,對(duì)應(yīng) delete(<query>,{justOne:false}) 方法 blogs.deleteMany(gte("likes",900));
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot aspect通過@annotation進(jìn)行攔截的實(shí)例代碼詳解
這篇文章主要介紹了springboot aspect通過@annotation進(jìn)行攔截的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08微服務(wù)實(shí)戰(zhàn)之怎樣提升springboot服務(wù)吞吐量
這篇文章主要介紹了微服務(wù)實(shí)戰(zhàn)之怎樣提升springboot服務(wù)吞吐量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08java從命令行獲取數(shù)據(jù)的三種方式代碼實(shí)例
這篇文章主要介紹了java從命令行獲取數(shù)據(jù)的三種方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot項(xiàng)目中獲取IP地址的實(shí)現(xiàn)示例
OkHttp是一個(gè)由Square開發(fā)的高效、現(xiàn)代的HTTP客戶端庫(kù),本文主要介紹了SpringBoot項(xiàng)目中獲取IP地址的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08SpringBoot項(xiàng)目如何打可執(zhí)行war包
最近小編做了一個(gè)springboot項(xiàng)目,最后需要打成war包在容器中部署,下面小編給大家分享下SpringBoot項(xiàng)目如何打可執(zhí)行war包,感興趣的朋友一起看看吧2020-04-04