轉載,原文連接:http://blog.csdn.net/autfish/article/details/51366839
MongoDB的3.x版本Java驅動相對2.x做了全新的設計,類庫和使用方法上有很大區別。例如用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 {
- //根據實際環境修改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");
- //每次執行前清空集合以方便重復運行
- 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()方法中演示,並且在執行后打印結果集以觀察查詢結果。下面來填充show()方法
注意需要靜態導入
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
import static com.mongodb.client.model.Sorts.*;
- //創建單字段索引
- mc.createIndex(new Document("words", 1));
- //創建組合索引(同樣遵循最左前綴原則)
- mc.createIndex(new Document("title", 1).append("owner", -1));
- //創建全文索引
- 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的數組
- iterable = mc.find(eq("tag.1", 2));
- printResult("Filters: tag.1 eq 2", iterable);
- //查詢匹配全部值的數組
- 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);
這里列出的查詢方式可以覆蓋到大部分開發需求,更多查詢需求請參考官方文檔。
(完)