java 實現mongoDB 增加,刪除,修改,查看,多條件查詢,聚合查詢,分組查詢,多表關聯查詢(史上最全)


首先idea創建一手springboot項目 引入如下依賴

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

下面是具體的java對mongod的操作。

需要將

data = mongod.getDatabase("runoob");

獲取的數據庫換成自己的數據庫,端口為默認端口

這里我寫了一個

@BeforeEach
@AfterEach
兩個注解:分別是在執行測試類之前執行和在測試類執行之后執行。我使用的是springboot2,如果是springboot1需要將這兩個注解修改為
@Before
@After
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.*;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.InsertOneModel;
import com.mongodb.client.model.UpdateOneModel;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.print.Doc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

@SpringBootTest
public class MongodJointTest {
    private MongoClient mongod;
    private MongoDatabase data;

    @BeforeEach
    public void mongoJoint() {
        mongod = new MongoClient("localhost", 27017);
        data = mongod.getDatabase("runoob");
    }

    @AfterEach
    public void closeMongo() {
        mongod.close();
    }


    //單條插入
    @Test
    public void insertMongo() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        Document c = new Document();
        c.append("title", "s標題qq");
        c.append("encode", 22.0);
        ab1.insertOne(c);
        System.out.println("數據插入成功");
    }

    //多條插入
    @Test
    public void insertManyMongo() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        Document c0 = new Document();
        c0.append("title", "標題0");
        c0.append("encode", 21.0);
        Document c1 = new Document();
        c1.append("title", "標題1");
        c1.append("encode", 22.0);
        Document c2 = new Document();
        c2.append("title", "標題2");
        c2.append("encode", 23.0);
        List<Document> c = Arrays.asList(c0, c1, c2);
        ab1.insertMany(c);
        System.out.println("數據插入成功");
    }

    //刪除
    @Test
    public void delMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        Document c = new Document();
        c.append("title", "a");
        ab1.deleteOne(c);
        //兩種寫法
        //ab1.deleteOne(Filters.eq("title","b"));
    }

    //修改信息
    @Test
    public void upMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        ab1.updateOne(Filters.eq("title", "標題"), new Document("$set", new Document("encode", 21.0)));
    }

    //批量插入,修改,(也可刪除)
    @Test
    public void sumMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        ab1.bulkWrite(Arrays.asList(new InsertOneModel<>(new Document("title", "p標題1")),
                new InsertOneModel<>(new Document("title", "p標題2")),
                new InsertOneModel<>(new Document("title", "p標題3")),
                new UpdateOneModel<>(new Document("title", "p標題1"), new Document("$set", new Document("title", "p批量修改標題")))
        ));
    }

    //查詢
    @Test
    public void sendMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> documents = ab1.find().limit(3).skip(2);
        for (Document doc : documents) {
            System.out.println(doc.get("_id") + "   " + doc.get("title") + "   " + doc.get("encode"));
        }
    }

    //排序
    @Test
    public void sendSortMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        Document c = new Document();
        //c.append("encode",1);
        c.append("encode", -1);
        FindIterable<Document> documents = ab1.find().sort(c);
        for (Document doc : documents) {
            System.out.println(doc.get("_id") + "   " + doc.get("title") + "   " + doc.get("encode"));
        }
    }

    //條件查詢
    @Test
    public void conditionMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> d = ab1.find(Filters.lt("encode", 20));
//         FindIterable<Document> d = ab1.find(Filters.lte("encode",20));
//         FindIterable<Document> d = ab1.find(Filters.gt("encode",20));
//         FindIterable<Document> d = ab1.find(Filters.gte("encode",20));
//         FindIterable<Document> d = ab1.find(Filters.ne("encode",20));
        for (Document doc : d) {
            System.out.println(doc.get("_id") + "   " + doc.get("title") + "   " + doc.get("encode"));
        }
    }


    //條件查詢
    @Test
    public void conditionMongod1() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        Bson where = Filters.and(Filters.gt("encode", 20), Filters.eq("title", "標題"));
        FindIterable<Document> d = ab1.find(where);
        for (Document doc : d) {
            System.out.println(doc.get("_id") + "   " + doc.get("title") + "   " + doc.get("encode"));
        }
    }

    //查詢一張表中的數據條數
    @Test
    public void countMongod() {
        MongoCollection<Document> collection = data.getCollection("ab1");
        FindIterable<Document> ab1 = collection.find();
        int i = 0;
        for (Document doc : ab1) {
            i++;
        }
        System.out.println(i);
    }

    //從第一條數據開是查詢出前五條數據
    @Test
    public void first5MongodToTitle() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> skip = ab1.find().limit(5).skip(0);
        for (Document doc : skip) {
            System.out.println(doc.get("title"));
        }
    }

    //查詢等於18的數據
    @Test
    public void encodeEq18Mongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> encode = ab1.find(Filters.eq("encode", 18));
        for (Document doc : encode) {
            System.out.println(doc.get("title"));
        }
    }

    //查詢大於等於18的數據
    @Test
    public void encodeGte18Mongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> encode = ab1.find(Filters.gte("encode", 18));
        for (Document doc : encode) {
            System.out.println(doc.get("title"));
        }
    }

    //查詢18到22之間的數據
    @Test
    public void encodeGte18Between22Mongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> encode = ab1.find(Filters.and(Filters.gt("encode", 18), Filters.lt("encode", 22)));
        for (Document doc : encode) {
            System.out.println(doc.get("title"));
        }
    }

    //根據標題查詢價格
    @Test
    public void getencodeTotitleMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        FindIterable<Document> documents = ab1.find(Filters.eq("title", "標題1"));
        for (Document document : documents) {
            System.out.println(document.get("encode"));
        }
    }

    //模糊查詢
    @Test
    public void LikeMongod() {
        MongoCollection<Document> ab1 = data.getCollection("ab1");
        //固定查詢
//        Pattern pattern = Pattern.compile("^標題0$", Pattern.CASE_INSENSITIVE);
        //包含查詢
//        Pattern pattern = Pattern.compile("^.*標.*$", Pattern.CASE_INSENSITIVE);
        //左固定
//        Pattern pattern = Pattern.compile("^標題.*$", Pattern.CASE_INSENSITIVE);
        //右固定
        Pattern pattern = Pattern.compile("^.*標題$", Pattern.CASE_INSENSITIVE);

        BasicDBObject obj = new BasicDBObject();
        obj.put("title", pattern);
        FindIterable<Document> documents = ab1.find(obj);
        for (Document document : documents) {
            System.out.println(document.get("encode"));
        }
    }


    //聚合查詢
    @Test
    public void groupMongod() {
        MongoCollection<Document> collection = data.getCollection("ab1");
        //對encode的數量進行分組,並且統計出個數
        Document doc = new Document();
        doc.append("_id", "$encode");
        doc.append("count", new Document("$sum", 1));
        //查找encode字段中數量大於18的
        Document matchDoc = new Document();
        matchDoc.put("_id", new Document("$gt", 18.0));
        Document group = new Document("$group", doc);
        Document match = new Document("$match", matchDoc);
        //根據encode字段進行降序排序
        Document sort = new Document("$sort", new Document("_id", 1));
        //將篩選條件添加到文本集合中
        List<Document> doclist = new ArrayList<Document>();
        doclist.add(group);
        doclist.add(match);
        doclist.add(sort);
        //聚合查詢並輸出
        AggregateIterable<Document> aggregate = collection.aggregate(doclist);
        MongoCursor<Document> iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            Document next = iterator.next();
            double encode = next.getDouble("_id");
            int count = next.getInteger("count", 0);
            System.out.println(encode + "      " + count);
        }
    }

    //在mongod控制台下執行下面三句命令
    /*db.test1.insert([{"title":"java開發手冊","author":"孤盡","jobnum":"001"},{"title":"mongod由淺入深","author":"涼風","jobnum":"002"}])
    db.test2.insert([{"jobtitle":"java工程師","jobnum":"001"},{"jobtitle":"數據庫工程師","jobnum":"002"}])
    db.test3.insert([{"depart":"開發1部","jobnum":"001"},{"depart":"開發2部","jobnum":"002"}])*/

    //三表帶篩選條件關聯查詢  關鍵字:lookup
    @Test
    public void lookupMongod() {
        MongoCollection<Document> test1 = data.getCollection("test1");

        List<Bson> aggregateList = new ArrayList<>(1);
        aggregateList.add(Aggregates.lookup("test2", "jobnum", "jobnum", "result"));
        aggregateList.add(Aggregates.match(Filters.ne("result", new ArrayList<String>(0))));

        aggregateList.add(Aggregates.lookup("test3", "jobnum", "jobnum", "results"));
        aggregateList.add(Aggregates.match(Filters.ne("results", new ArrayList<String>(0))));

        aggregateList.add(Aggregates.match(Filters.eq("jobnum", "002")));

        AggregateIterable<Document> aggregateIterable = test1.aggregate(aggregateList);
        //對應得到的json結果參考下方
        for (Document document : aggregateIterable) {
            Object result = document.get("result");
            String[] split = result.toString().split(",");
            System.out.println(split[1].substring(split[1].indexOf("=") + 1));

            Object results = document.get("results");
            String[] splits = results.toString().split(",");
            System.out.println(splits[1].substring(splits[1].indexOf("=") + 1));
        }

    }


//    { "_id" : { "$oid" : "5eba18b5108d9caa7dba842a" },
//        "title" : "java開發手冊",
//            "author" : "孤盡",
//            "jobnum" : "001",
//            "result" : [{
//        "_id" : { "$oid" : "5eba1aa2108d9caa7dba8430" },
//        "jobtitle" : "java工程師",
//                "jobnum" : "001"
//    }],
//        "results" : [{
//        "_id" : { "$oid" : "5eba3333108d9caa7dba8432" },
//        "depart" : "開發1部",
//                "jobnum" : "001"
//    }]
//    }

}
 

 


免責聲明!

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



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