mongodb java客戶端的使用,即MongoClient
Java 連線 MongoDB
MongoDB 提供了一系列的驅動用於支援各種語言連線 mongodb 資料庫,包括:Java,Python,C++,Scala,PHP 等,完整的驅動列表:https://docs.mongodb.com/manual/applications/drivers/index.html
其中對於 Java 提供了 mongo-java-driver 庫支援 Mongo JDBC 驅動,使用該驅動只要在專案依賴中匯入:org.mongodb:mongo-java-driver
如在使用 gradle 構建的專案中,如下匯入:
compile 'org.mongodb:mongo-java-driver:3.6.3'
Mongo JDBC 驅動文件主頁:http://mongodb.github.io/mongo-java-driver/;
可以在驅動主頁查詢該驅動的詳細用法,一下示例基本使用,包括:資料庫連線、CURD 操作,使用版本為:mongodb 3.6,mongo-java-driver 3.6,不同版本的驅動的 API 由一些差異,詳細請查詢驅動文件;
示例用的資料庫集合 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
}
資料庫連線
1)無驗證連線
MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
//或者使用 mongo uri
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017"));
2)驗證連線
String user = "assad"; //使用者名稱
String database = "testdb"; //資料庫
char[] password = "123".toCharArray(); //密碼
MongoCredential credential = MongoCredential.createCredential(user,database,password); //驗證物件
MongoClientOptions options = MongoClientOptions.builder().sslEnabled(false).build(); //連線操作物件
MongoClient mongoClient = new MongoClient(new ServerAddress("127.0.0.1",27017),credential,options); //連線物件
//或者使用 mongo uri
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:
其中 mongo uri 的驗證連線格式如下:
mongodb://userName:[email protected]/?authSource=databaseName&ssh=true;
獲取資料庫 & 集合
//獲取指定資料庫物件
MongoDatabase db = mongoClient.getDatabase("testdb");
//獲取指定集合物件
MongoCollection<Document> blogs = db.getCollection("blog");
//列舉所有資料庫名稱
for(String dbName : blogs.listDatabaseNames()
System.out.println(dbName);
//列舉指定資料庫中所有集合名稱
for(String colName: db.listCollectionNames())
System.out.println(colName);
以下示例中,對於文件結果的輸出都使用 Log4j2 進行標準輸出;
select 查詢操作
1)查詢結果遍歷
在 MongoDB JDBC 中,會對查詢結果生成一個 FindIterable<Document> 物件,可以通過獲取其迭代器對其進行迭代,同時該物件也提供了 foreach 方法,通過傳入一個 Block 物件,可以對結果進行阻塞迭代;
//資料庫連線
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:[email protected]:27017/?authSource=testdb&ssl=false"));
MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog");
//查詢所有文件,遍歷輸出結果
for (Document document1 : blogs.find())
log.debug(document1.toJson());
//查詢所有文件,使用遍歷器遍歷結果
MongoCursor<Document> cursor = blogs.find().iterator();
while(cursor.hasNext())
log.debug(cursor.next().toJson());
//查詢所有文件,對所有結果使用阻塞回調方法
blogs.find().forEach((Block<Document>) document -> {
log.debug(document.toJson());
});
//查詢所有文件,獲取結果文件中的 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)條件查詢
對於條件查詢,可以通過構造一個個巢狀的 Document 物件,產生類似 mongodb 查詢語法的 Document 鏈來進行查詢;或者使用 Filters 中的各種靜態方法(如 eq,lte等)來進行函式式地查詢,MongoDB JDBC 已經將絕大部分的 mongodb 查詢條件操作符封裝為函式式呼叫;
//條件查詢: 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)查詢結果對映,排序,限制
//對映操作, 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 資料聚合操作
//資料聚合: 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());
});
//資料聚合: 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 插入操作
//資料庫連線
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:[email protected]:27017/?authSource=testdb&ssl=false"));
MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog");
//插入一個文件
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);
//插入多個文件
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 操作
//資料庫連線
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:[email protected]:27017/?authSource=testdb&ssl=false"));
MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog");
//更改第一條匹配條件的文件記錄,對應 update(<query>,{muti:false}) 方法
blogs.updateOne(and(eq("author","assad"),eq("title","SqlLite Overview"))
,combine(set("author","assad_1"),set("likes",0)));
//更改所有匹配條件的文件記錄,對應 update(<query>,{muti:true}) 方法
blogs.updateMany(lte("likes",300)
, inc("likes",100));
//完全替換一條文件記錄,對應 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 操作
//資料庫連線
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://assad:[email protected]:27017/?authSource=testdb&ssl=false"));
MongoCollection<Document> blogs = mongoClient.getDatabase("testdb").getCollection("blog");
//刪除第一條滿足查詢條件的文件記錄,對應 delete(<query>,{justOne:true}) 方法
blogs.deleteOne(eq("author","Alex"));
//刪除所有滿足查詢條件的文件記錄,對應 delete(<query>,{justOne:false}) 方法
blogs.deleteMany(gte("likes",900));
原文:https://blog.csdn.net/Al_assad/article/details/79345018