引入依賴:
<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"))); }
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", "哈哈哈哈"))); }
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"))); }
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); }
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); }
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集合中文檔的數量
/* $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的總和
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的總和
/* 聚合操作:分組前的數據過濾 查詢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")); } }