mongo-java-driver操作MongoDB


引入依賴:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.8.2</version>
</dependency>


1、連接MongoDB數據庫

1)直連方式

public class MongoDBUtil {

    private static MongoClient client = null;

    static {
        if(client==null){
            client = new MongoClient("192.168.3.56", 27017);
        }
    }

    //獲取MongoDB數據庫
    public static MongoDatabase getDatabase(String databaseName){
        return client.getDatabase(databaseName);
    }

    //獲取Mongo集合
    public static MongoCollection getCollection(String databaseName,String collectionName){
        return getDatabase(databaseName).getCollection(collectionName);
    }
}


2)直連方式支持用戶認證

/**
 * @author houChen
 * @date 2021/7/10 17:34
 * @Description: 創建MongoDB攔截,使用用戶認證
 */
public class MongoDBAuthUtil {

    private static MongoClient client = null;

    static {
        if(client==null){
            //創建一個用戶認證信息
            MongoCredential credential = MongoCredential.createCredential("itsxt","develope","itsxtpwd".toCharArray());
            //封裝MongoDB的地址和端口
            ServerAddress address = new ServerAddress("192.168.3.56", 27017);
            //方法過時是由於現在推薦池連的方式
            client = new MongoClient(address, Arrays.asList(credential));
        }
    }

    //獲取MongoDB數據庫
    public static MongoDatabase getDatabase(String databaseName){
        return client.getDatabase(databaseName);
    }

    //獲取Mongo集合
    public static MongoCollection getCollection(String databaseName,String collectionName){
        return getDatabase(databaseName).getCollection(collectionName);
    }
}


3)池連方式

public class MongoDBPoolUtil {

    private static MongoClient client = null;

    static {
        if(client==null){
            MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
            //設置每個連接地址的最大連接數
            builder.connectionsPerHost(10);
            //設置連接的超時時間
            builder.connectTimeout(5000);
            //設置讀寫的超時時間
            builder.socketTimeout(5000);
            ServerAddress address = new ServerAddress("192.168.3.56", 27017);
            client = new MongoClient(address,builder.build());
        }
    }

    //獲取MongoDB數據庫
    public static MongoDatabase getDatabase(String databaseName){
        return client.getDatabase(databaseName);
    }

    //獲取Mongo集合
    public static MongoCollection getCollection(String databaseName, String collectionName){
        return getDatabase(databaseName).getCollection(collectionName);
    }
}


4)池連方式支持認證

/**
 * @author houChen
 * @date 2021/7/10 18:08
 * @Description:  支持用戶認證的池連
 */
public class MongoDBPoolAuthUtil {

    private static MongoClient client = null;

    static {
        if(client==null){
            MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
            //設置每個連接地址的最大連接數
            builder.connectionsPerHost(10);
            //設置連接的超時時間
            builder.connectTimeout(5000);
            //設置讀寫的超時時間
            builder.socketTimeout(5000);
            //創建一個用戶認證信息
            MongoCredential credential = MongoCredential.createCredential("itsxt","develope","itsxtpwd".toCharArray());
            //封裝MongoDB的地址和端口
            ServerAddress address = new ServerAddress("192.168.3.56", 27017);
            client = new MongoClient(address,credential,builder.build());
        }
    }

    //獲取MongoDB數據庫
    public static MongoDatabase getDatabase(String databaseName){
        return client.getDatabase(databaseName);
    }

    //獲取Mongo集合
    public static MongoCollection getCollection(String databaseName, String collectionName){
        return getDatabase(databaseName).getCollection(collectionName);
    }
}


2、操作集合

1)創建集合

MongoDatabase develope = MongoDBPoolUtil.getDatabase("develope");
develope.createCollection("test1");


2)獲取集合

MongoCollection<Document> test = develope.getCollection("test");
System.out.println(test.getNamespace());


3)刪除集合

MongoCollection<Document> test = develope.getCollection("test1");
test.drop();


3、插入文檔

1)單個文檔插入

public void insertSingleDocument(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    Document document = new Document();
    document.append("username","liss").append("age",18 ).append("desc", "prefect");
    collection.insertOne(document);
}


2)插入多個文檔

public void insertManyDocument(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    List<Document> list = new ArrayList<Document>();
    for(int i=0;i<5;i++){
        Document document = new Document();
        document.append("username","liss"+i).append("age",18+i ).append("desc", "prefect"+i);
        list.add(document);
    }
    collection.insertMany(list);
}


4、更新文檔

1)更新單個文檔單個鍵

/*
更新單個文檔單個key
 */
public void updateSingleDocumentSingleKey(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");

    collection.updateOne(Filters.eq("username","liss"),
            new Document("$set",new Document("userage",100)));
}


2)更新單個文檔多個鍵

/*
更新單個文檔多個鍵
 */
public void updateSingleDocumentManyKey(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");

    collection.updateOne(Filters.eq("username","liss"),
            new Document("$set",new Document("userage",100).append("age", "13")));
}


3)更新多個文檔單個鍵

/*
更新單個文檔單個個鍵
將username不為空的文檔的age修改為100
 */
public void updateManyDocumentSingleKey(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");

    collection.updateMany(Filters.ne("username",null),
            new Document("$set",new Document("desc","very good")));
}

clipboard


4)更新多個文檔的多個鍵

/*
更新多個文檔多個鍵
將username不為空的文檔的age修改為3歲,desc修改為哈哈哈哈
 */
 public void updateManyDocumentManyKey(){
     MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");

     collection.updateMany(Filters.ne("username",null),
             new Document("$set",new Document("age","3歲").append("desc", "哈哈哈哈")));
 }

clipboard


5)更新文檔的數組

/*
    更新文檔的數組
    將username為lisi的insterts數組中添加art
 */
public void updateArray(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    collection.updateOne(Filters.eq("username", "liss"),
            new Document("$push",new Document("insterts","art")));
}

clipboard


5、查詢文檔

1)查詢所有文檔

public void searchAllDocument(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


2)根據_id查詢文檔

/*
根據_id查詢文檔
 */
public void searchDocumentById(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.eq("_id",new ObjectId("60ea475b28339539c8b814f4"))); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


3)查詢多個文檔 $gt

/*
    查詢多個文檔 $gt
    查詢年齡大於19的文檔
 */
public void searchDocumentByCondition(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.gt("age",19)); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


4)查詢多個文檔 $type

/*
    查詢多個文檔 $type
    查詢age為number文檔
 */
public void searchDocumentByType(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.type("age","number")); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


5)查詢多個文檔 $in $nin

/*
    查詢多個文檔 $in
    查詢username為liss,liss1,liss2文檔
    $nin=>表示不在這個數組中的文檔 ·
 */
public void searchDocumentByIn(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.in("username","liss","liss1","liss2")); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


6)查詢多個文檔 $regex (根據正則表達式來查詢)

/*
    查詢多個文檔 $regex
    查詢以l開頭,2結尾的文檔
 */
public void searchDocumentByRegex(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.regex("username","^l.*2$")); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


7)查詢多個文檔 邏輯運算符 $and $or

/*
查詢文檔 邏輯運算符$and
查詢用戶名稱為liss1 年齡為18的文檔
 */
public void searchDocumentByAnd(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.and(Filters.eq("username","liss"),Filters.eq("age", 18))); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}

/*
查詢文檔 邏輯運算符$or
查詢用戶名稱為liss1 或者年齡為18的文檔
 */
public void searchDocumentByAnd(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find(Filters.or(Filters.eq("username","liss"),Filters.eq("age", 18))); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


8)查詢文檔 - 排序處理

/*
查詢文檔  $and和$or聯合使用
查詢文檔,根據userName降序排序
 */
public void searchDocumentBySort(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    FindIterable<Document> iterable = collection.find().sort(new Document("username", 1));
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+document.get("age"));
    }
}


6、日期操作

1)插入系統當前日期

/*
插入系統當前日期
 */
public void insertSystemDate(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");
    Document document = new Document();
    document.put("username", "zhangsan");
    document.put("age", 22);
    document.put("desc", "very good");
    document.put("userBirth", new Date());
    collection.insertOne(document);
}

clipboard


2)添加指定日期

/*
插入指定日期
 */
 public void insertDate() throws ParseException {
     MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");

     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
     Date date = simpleDateFormat.parse("2021-07-16 08:00:00");

     Document document = new Document();
     document.put("username", "zhangsan");
     document.put("age", 22);
     document.put("desc", "very good");
     document.put("userBirth", date);
     collection.insertOne(document);
 }

clipboard


3)查詢日期 $eq

/*
查詢日期 $qe
 */
public void searchByDate() throws ParseException {
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date date = simpleDateFormat.parse("2021-07-16 08:00:00");
    FindIterable<Document> iterable = collection.find(Filters.eq("userBirth",date)); //返回的是一個迭代器
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("username")+" "+ document.get("age")+" "+document.get("userBirth"));
    }
}

【注意】java會將mongo中查出來的時間自動轉化時區


7、聚合操作

1)計算文檔總數

查詢test集合中文檔的數量

clipboard

/*
$sum
查詢集合中的文檔數量
 */
public void selectDocumentAggregateCount(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test");
    Document sum = new Document();
    sum.put("$sum", 1);
    Document count = new Document();
    count.put("_id", null);
    count.put("count",sum);
    Document group = new Document();
    group.put("$group",count);
    List<Document> list = new ArrayList<Document>();
    list.add(group);
    AggregateIterable iterable = collection.aggregate(list);
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("_id")+" "+document.get("count"));
    }
}


2)聚合操作 $sum

以title進行分組,並計算每組size的總和

clipboard

public void selectDocumentAggregateSizeSum(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");
    Document sum = new Document();
    sum.put("$sum", "$size");
    Document count = new Document();
    count.put("_id", "$title");
    count.put("count",sum);
    Document group = new Document();
    group.put("$group",count);
    List<Document> list = new ArrayList<Document>();
    list.add(group);
    AggregateIterable iterable = collection.aggregate(list);
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("_id")+" "+document.get("count"));
    }
}


3)聚合操作:分組前的數據過濾

查詢dev集合size > 200 的文檔,並按照title分組,計算size的總和

clipboard

/*
 聚合操作:分組前的數據過濾
 查詢dev集合有多少size > 200 的文檔
 */
public void selectDocumentAggregateSizeGt200(){
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test");
    Document size = new Document();
    size.put("size", new Document().append("$gt", 200));
    Document match = new Document();
    match.put("$match", size);

    Document sum = new Document();
    sum.put("$sum", "$size");
    Document count = new Document();
    count.put("_id", "$title");
    count.put("count",sum);
    Document group = new Document();
    group.put("$group",count);
    List<Document> list = new ArrayList<Document>();
    list.add(match);
    list.add(group);
    AggregateIterable iterable = collection.aggregate(list);
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("_id")+" "+document.get("count"));
    }
}


4)聚合操作 $project 聚合投影約束


5)分頁操作 使用skip和limit進行分頁

/*
分頁操作 使用skip和limit進行分頁
 */
public void selectDocumentByPage(int page) {
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope", "test");
    FindIterable iterable = collection.find().skip((page - 1) * 2).limit(2);
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("_id")+" "+document.get("title")+" "+document.get("size"));
    }
}


6)分頁查詢優化

使用條件判斷替換skip方法

=》查詢大於某個條件的所有文檔,然后再進行分頁

/*
分頁操作 使用條件判斷實現分頁查詢
 */
public void selectDocumentByPage1(int pageIndex,int page,String lastId) {
    MongoCollection collection = MongoDBPoolUtil.getCollection("develope", "test");
    FindIterable iterable = null;
    Document condition = new Document();
    if(pageIndex==1){
        iterable = collection.find(condition).limit(page);
    }else{
        if(lastId != null){
            condition.append("_id", new Document("$gt",new ObjectId(lastId));
            iterable = collection.find(condition).limit(page);
        }
    }
    MongoCursor<Document> cursor = iterable.iterator();  //返回的是一個游標
    while (cursor.hasNext()){
        Document document = cursor.next();
        System.out.println(document.get("_id")+" "+document.get("title")+" "+document.get("size"));
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM