zoukankan      html  css  js  c++  java
  • 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"
    //    }]
    //    }
    
    }
     
  • 相关阅读:
    索引唯一性扫描(INDEX UNIQUE SCAN)
    索引范围扫描(INDEX RANGE SCAN)
    算法设计与分析——回溯法算法模板
    操作系统考试复习大纲
    windows cmd 生成文件目录树
    Java 匿名类和lambda表达式
    下载Abook 高等教育出版社网站资料
    操作系统——银行家算法(Banker's Algorithm)
    算法设计与分析——最大团问题(回溯法)
    JVM内存区域
  • 原文地址:https://www.cnblogs.com/g2vbn/p/12858777.html
Copyright © 2011-2022 走看看