1. 程式人生 > >mongodb java客戶端的使用,即MongoClient

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:

[email protected]:27017/?authSource=testdb&ssl=false"));
其中 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