MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
生活随笔
收集整理的這篇文章主要介紹了
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
MongoDB的3.x版本Java驅動相對2.x做了全新的設計,類庫和使用方法上有很大區(qū)別。例如用Document替換BasicDBObject、通過Builders類構建Bson替代直接輸入$命令等,本文整理了基于3.2版本的常用增刪改查操作的使用方法。為了避免冗長的篇幅,分為增刪改、查詢、聚合、地理索引等幾部分。
先看用于演示的類的基本代碼
import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Projections.*; import static com.mongodb.client.model.Sorts.*;import java.text.ParseException; import java.util.Arrays;import org.bson.BsonType; import org.bson.Document;import com.mongodb.Block; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections;public class FindExamples {public static void main(String[] args) throws ParseException {//根據(jù)實際環(huán)境修改ip和端口MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase database = mongoClient.getDatabase("lesson");FindExamples client = new FindExamples(database);client.show();mongoClient.close();}private MongoDatabase database;public FindExamples(MongoDatabase database) {this.database = database;}public void show() {MongoCollection<Document> mc = database.getCollection("blog");//每次執(zhí)行前清空集合以方便重復運行mc.drop();//插入用于測試的文檔Document doc1 = new Document("title", "good day").append("owner", "tom").append("words", 300).append("comments", Arrays.asList(new Document("author", "joe").append("score", 3).append("comment", "good"), new Document("author", "white").append("score", 1).append("comment", "oh no")));Document doc2 = new Document("title", "good").append("owner", "john").append("words", 400).append("comments", Arrays.asList(new Document("author", "william").append("score", 4).append("comment", "good"), new Document("author", "white").append("score", 6).append("comment", "very good")));Document doc3 = new Document("title", "good night").append("owner", "mike").append("words", 200).append("tag", Arrays.asList(1, 2, 3, 4));Document doc4 = new Document("title", "happiness").append("owner", "tom").append("words", 1480).append("tag", Arrays.asList(2, 3, 4));Document doc5 = new Document("title", "a good thing").append("owner", "tom").append("words", 180).append("tag", Arrays.asList(1, 2, 3, 4, 5));mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5));//測試: 查詢全部FindIterable<Document> iterable = mc.find();printResult("find all", iterable);//TODO: 將在這里填充更多查詢示例}//打印查詢的結果集public void printResult(String doing, FindIterable<Document> iterable) {System.out.println(doing);iterable.forEach(new Block<Document>() {public void apply(final Document document) {System.out.println(document);}});System.out.println("------------------------------------------------------");System.out.println();} }如上面代碼所示,把所有的查詢操作集中在show()方法中演示,并且在執(zhí)行后打印結果集以觀察查詢結果。下面來填充show()方法 //創(chuàng)建單字段索引 mc.createIndex(new Document("words", 1)); //創(chuàng)建組合索引(同樣遵循最左前綴原則) mc.createIndex(new Document("title", 1).append("owner", -1)); //創(chuàng)建全文索引 mc.createIndex(new Document("title", "text"));//查詢全部 FindIterable<Document> iterable = mc.find(); printResult("find all", iterable);//查詢title=good iterable = mc.find(new Document("title", "good")); printResult("find title=good", iterable);//查詢title=good and owner=tom iterable = mc.find(new Document("title", "good").append("owner", "tom")); printResult("find title=good and owner=tom", iterable);//查詢title like %good% and owner=tom iterable = mc.find(and(regex("title", "good"), eq("owner", "tom"))); printResult("find title like %good% and owner=tom", iterable);//查詢全部按title排序 iterable = mc.find().sort(ascending("title")); printResult("find all and ascending title", iterable);//查詢全部按owner,title排序 iterable = mc.find().sort(ascending("owner", "title")); printResult("find all and ascending owner,title", iterable);//查詢全部按words倒序排序 iterable = mc.find().sort(descending("words")); printResult("find all and descending words", iterable);//查詢owner=tom or words>350 iterable = mc.find(new Document("$or", Arrays.asList(new Document("owner", "tom"), new Document("words", new Document("$gt", 350))))); printResult("find owner=tom or words>350", iterable);//返回title和owner字段 iterable = mc.find().projection(include("title", "owner")); printResult("find all include (title,owner)", iterable);//返回除title外的其他字段 iterable = mc.find().projection(exclude("title")); printResult("find all exclude title", iterable);//不返回_id字段 iterable = mc.find().projection(excludeId()); printResult("find all excludeId", iterable);//返回title和owner字段且不返回_id字段 iterable = mc.find().projection(fields(include("title", "owner"), excludeId())); printResult("find all include (title,owner) and excludeId", iterable);//內嵌文檔匹配 iterable = mc.find(new Document("comments.author", "joe")); printResult("find comments.author=joe", iterable);//一個錯誤的示例, 想查詢評論中包含作者是white且分值>2的, 返回結果不符合預期 iterable = mc.find(new Document("comments.author", "white").append("comments.score", new Document("$gt", 2))); printResult("find comments.author=white and comments.score>2 (wrong)", iterable);//上面的需求正確的寫法 iterable = mc.find(Projections.elemMatch("comments", Filters.and(Filters.eq("author", "white"), Filters.gt("score", 2)))); printResult("find comments.author=white and comments.score>2 using elemMatch", iterable);//查找title以good開頭的, 并且comments只保留一個元素 iterable = mc.find(Filters.regex("title", "^good")).projection(slice("comments", 1)); printResult("find regex ^good and slice comments 1", iterable);//全文索引查找 iterable = mc.find(text("good")); printResult("text good", iterable);//用Filters構建的title=good iterable = mc.find(eq("title", "good")); printResult("Filters: title eq good", iterable);//$in 等同于sql的in iterable = mc.find(in("owner", "joe", "john", "william")); printResult("Filters: owner in joe,john,william", iterable);//$nin 等同于sql的not in iterable = mc.find(nin("owner", "joe", "john", "tom")); printResult("Filters: owner nin joe,john,tom", iterable);//查詢內嵌文檔 iterable = mc.find(in("comments.author", "joe", "tom")); printResult("Filters: comments.author in joe,tom", iterable);//$ne 不等于 iterable = mc.find(ne("words", 300)); printResult("Filters: words ne 300", iterable);//$and 組合條件 iterable = mc.find(and(eq("owner", "tom"), gt("words", 300))); printResult("Filters: owner eq tom and words gt 300", iterable);//較復雜的組合 iterable = mc.find(and(or(eq("words", 300), eq("words", 400)), or(eq("owner", "joe"), size("comments", 2)))); printResult("Filters: (words=300 or words=400) and (owner=joe or size(comments)=2)", iterable);//查詢第2個元素值為2的數(shù)組 iterable = mc.find(eq("tag.1", 2)); printResult("Filters: tag.1 eq 2", iterable);//查詢匹配全部值的數(shù)組 iterable = mc.find(all("tag", Arrays.asList(1, 2, 3, 4))); printResult("Filters: tag match all (1, 2, 3, 4)", iterable);//$exists iterable = mc.find(exists("tag")); printResult("Filters: exists tag", iterable);iterable = mc.find(type("words", BsonType.INT32)); printResult("Filters: type words is int32", iterable);這里列出的查詢方式可以覆蓋到大部分開發(fā)需求,更多查詢需求請參考官方文檔。
(完)
轉載于:https://www.cnblogs.com/autfish/p/5557564.html
總結
以上是生活随笔為你收集整理的MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Grunt教程——安装Grunt
- 下一篇: 边学习新技术边工作的重要性