標籤:
MongoDB的3.x版本java驅動相對2.x做了全新的設計,類庫和使用方法上有很大區別。例如用Document替換BasicDBObject、通過Builders類構建Bson替代直接輸入$命令等,本文整理了基於3.2版本的常用增刪改查操作的使用方法。為了避免冗長的篇幅,分為增刪改、查詢、彙總、地理索引等幾部分。
建立一個maven項目,添加依賴
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.2.2</version> </dependency></dependencies>
非maven項目可自行下載jar包
http://central.maven.org/maven2/org/mongodb/mongo-java-driver/3.2.2/mongo-java-driver-3.2.2.jar
建立基礎代碼測試連接
public class CudExamples {public static void main(String[] args) throws ParseException {//根據實際環境修改ip和連接埠MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase database = mongoClient.getDatabase("lesson");MongoCollection<Document> mc = database.getCollection("language");//插入一個文檔 mc.insertOne(new Document("oop", "java"));System.out.println(mc.findOneAndDelete(new Document("oop", "java"))); mongoClient.close();}}如果輸出結果為Document{{_id=573099877bee0e1710d52f4b, oop=java}}表示環境配置正確。
改造CudExamples類以方便示範每種操作對集合的影響
public class CudExamples {public static void main(String[] args) throws ParseException {MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase database = mongoClient.getDatabase("lesson");CudExamples client = new CudExamples(database);client.show();mongoClient.close();}private MongoDatabase database;public CudExamples(MongoDatabase database) {this.database = database;}public void show() {MongoCollection<Document> mc = database.getCollection("language");//每次執行前清空集合以方便重複運行mc.drop();mc.insertOne(new Document("oop", "java"));printCollection("insert java", mc);}//列印查詢的結果集public void printCollection(String doing, MongoCollection<Document> mc) {System.out.println(doing);FindIterable<Document> iterable = mc.find(); iterable.forEach(new Block<Document>() { public void apply(final Document document) { System.out.println(document); } }); System.out.println("------------------------------------------------------"); System.out.println();}}
如上面代碼所示,把所有的操作集中在show()方法中示範,並且在執行後列印集合以觀察對集合的影響。下面來填充show()方法,注意需要靜態匯入Updates.*
import static com.mongodb.client.model.Updates.*;
mc.insertOne(new Document("oop", "java"));printCollection("insert java", mc);//插入一個包含兩個欄位的文檔Document doc = new Document("oop", "csharp").append("copyright", "microsoft");mc.insertOne(doc);printCollection("insert csharp", mc);//尋找並修改一個文檔mc.findOneAndReplace(new Document("oop", "java"), new Document("oop", "java").append("copyright", "oracle"));printCollection("findAndReplace java", mc);//刪除一個文檔mc.deleteOne(new Document("oop", "java"));printCollection("delete java", mc);//刪除全部文檔mc.deleteMany(new Document());printCollection("delete all", mc);//重新插入測試文檔mc.insertOne(new Document("oop", "java").append("copyright", "oracle"));mc.insertOne(new Document("oop", "csharp").append("copyright", "microsoft"));printCollection("insert java,csharp and swift", mc);//$set 文檔中存在指定欄位則修改,沒有則添加mc.updateMany(new Document(), set("rank", 100));printCollection("$set all rank 100", mc);//$unset 文檔中存在指定欄位則刪除該欄位mc.updateOne(new Document("oop", "csharp"), unset("rank"));printCollection("unset csharp rank", mc);//$inc 文檔中存在指定欄位則相加,沒有則添加mc.updateOne(new Document("oop", "csharp"), inc("rank", 30));printCollection("$inc csharp rank 30", mc);mc.updateOne(new Document("oop", "csharp"), inc("rank", 31));printCollection("$inc csharp rank 31", mc);//$setOnInsert 在更新時指定upsert=true並實際觸發了插入操作時生效mc.updateOne(new Document("oop", "swift").append("copyright", "apple"), setOnInsert("rank", 100), new UpdateOptions().upsert(true));printCollection("$setOnInsert rank 100 for swift", mc);//$mul 相乘mc.updateOne(new Document("oop", "java"), mul("rank", 0.2));printCollection("$mul java rank: 0.2", mc);//$rename 重新命名mc.updateMany(new Document(), rename("rank", "ranks"));printCollection("$rename all rank to ranks", mc);//$min 取當前值和指定值之間比較小的mc.updateMany(new Document(), min("ranks", 50));printCollection("$min all ranks: 50", mc);//$max 取當前值和指定值之間比較大的mc.updateMany(new Document(), max("ranks", 40));printCollection("$max all ranks: 40", mc);//$currentDatemc.updateMany(new Document("oop", "java"), currentDate("add"));printCollection("$currentDate java", mc);//$currentTimestampmc.updateMany(new Document("oop", "java"), currentTimestamp("lastModified"));printCollection("$currentTimestamp java", mc);//$addToSet 添加一個元素到不重複集合mc.updateMany(new Document("oop", "java"), addToSet("keywords", "for"));mc.updateMany(new Document("oop", "java"), addToSet("keywords", "for"));printCollection("$addToSet java keywords: for", mc);//$addEachToSet 添加一組元素到不重複集合mc.updateMany(new Document("oop", "java"), addEachToSet("keywords", Arrays.asList("while", "true", "do", "new", "override")));mc.updateMany(new Document("oop", "java"), addEachToSet("keywords", Arrays.asList("while", "true", "do", "new", "override")));printCollection("$addEachToSet java keywords: while,true,do,new,override", mc);//$popFirst 刪除第一個元素mc.updateMany(new Document("oop", "java"), popFirst("keywords"));printCollection("$popFirst java keywords", mc);//$popLast 刪除最後一個元素mc.updateMany(new Document("oop", "java"), popLast("keywords"));printCollection("$popLast java keywords", mc);//$pull 刪除指定元素mc.updateMany(new Document("oop", "java"), pull("keywords", "new"));printCollection("$pull java keywords: new", mc);//$pullByFilter 根據Filters刪除mc.updateMany(new Document("oop", "java"), pullByFilter(Filters.gte("keywords", "true")));printCollection("$pullByFilter java keywords: true", mc);//$pullAll 刪除一組元素mc.updateMany(new Document("oop", "java"), pullAll("keywords", Arrays.asList("while", "true", "do", "new", "override")));printCollection("$pullAll java keywords", mc);//$push 添加一個元素到可重複集合mc.updateMany(new Document("oop", "java"), push("scores", 89));printCollection("$push java scores: 89", mc);//$pushEach 添加一組元素到可重複集合mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(89, 90, 92)));printCollection("$pushEach java scores: 89,90,92", mc);//在集合的指定位置插入一組元素mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(11, 12, 13), new PushOptions().position(0)));printCollection("$pushEach java scores: 11,12,13 at position 0", mc);//在集合的指定位置插入一組元素並倒序排列mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(40, 41), new PushOptions().sort(-1)));printCollection("$pushEach java scores: 40,41 and sort(-1)", mc);//在集合的指定位置插入一組元素, 倒序排列後保留前3個mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(60, 61), new PushOptions().sort(-1).slice(3)));printCollection("$pushEach java scores: 60,61 and sort(-1) and slice(3)", mc);//插入一組內嵌文檔Bson bson = pushEach("experts", Arrays.asList(new Document("first", "Rod").append("last", "Johnson"), new Document("first", "Doug").append("last", "Cutting")));mc.updateOne(new Document("oop", "java"), bson);printCollection("$pushEach", mc);//combine 組合Bsonbson = combine(set("author", "James Gosling"), set("version", "8.0"));mc.updateOne(new Document("oop", "java"), bson);printCollection("$combine", mc);(完)
MongoDB-JAVA-Driver 3.2版本常用代碼全整理(1) - 增刪改