zoukankan      html  css  js  c++  java
  • SpringBoot MongoDB

    SpringBoot Mongo

     

     

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    
    <!--sql转mongo语法工具-->
    <dependency>
        <groupId>com.github.vincentrussell</groupId>
        <artifactId>sql-to-mongo-db-query-converter</artifactId>
        <version>1.11</version>
    </dependency>
    package cn.stylefeng.guns.utils;
    
    import cn.stylefeng.guns.GunsApplication;
    import cn.stylefeng.guns.core.util.RedisUtil;
    import cn.stylefeng.guns.modular.system.model.ApplicationData;
    import com.alibaba.fastjson.JSONObject;
    import com.github.vincentrussell.query.mongodb.sql.converter.MongoDBQueryHolder;
    import com.github.vincentrussell.query.mongodb.sql.converter.ParseException;
    import com.github.vincentrussell.query.mongodb.sql.converter.QueryConverter;
    import com.mongodb.*;
    import com.mongodb.client.*;
    import org.beetl.ext.format.DateFormat;
    import org.bson.Document;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.aggregation.*;
    import org.springframework.data.mongodb.core.query.BasicQuery;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
    import static org.springframework.data.mongodb.core.aggregation.ArithmeticOperators.*;
    import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.when;
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = GunsApplication.class)
    public class MongodbTest {
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
    
        @Test
        public void mongoTest() {
            // 直接执行原生查询语句  https://blog.csdn.net/dark_horse_lk/article/details/100563960
    //        ArrayList<BasicDBObject> list = new ArrayList<>();
    //        String condition = "{
    " +
    //                "    "$group":{
    " +
    //                "        "_id":"$SEX",
    " +
    //                "        "count":{$sum:1},
    " +
    //                "        "d1":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","0"]},{"$lte":["$AGE_DX","15"]}]},then:1,else:0}}},
    " +
    //                "        "d2":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","16"]},{"$lte":["$AGE_DX","30"]}]},then:1,else:0}}},
    " +
    //                "        "d3":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","31"]},{"$lte":["$AGE_DX","45"]}]},then:1,else:0}}},
    " +
    //                "        "d4":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","46"]},{"$lte":["$AGE_DX","60"]}]},then:1,else:0}}},
    " +
    //                "        "d5":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","61"]},{"$lte":["$AGE_DX","75"]}]},then:1,else:0}}},
    " +
    //                "        "d6":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","76"]},{"$lte":["$AGE_DX","90"]}]},then:1,else:0}}},
    " +
    //                "        "d7":{$sum:{$cond:{if:{"$gt":["$AGE_DX","90"]},then:1,else:0}}}
    " +
    //                "        }
    " +
    //                "}";
    //        BasicDBObject group = BasicDBObject.parse(condition);
    //        list.add(group);
    //        BasicDBObject limit = BasicDBObject.parse("{$limit:3}");
    //        list.add(limit);
    //        AggregateIterable<Document> documents = mongoTemplate.getCollection("xinhua").aggregate(list);
    //        for (Map document : documents) {
    //            System.out.println(document);
    //        }
    //        for (Map document : documents) {
    //            System.out.println(document);
    //        }
    
            // 基本查询 https://www.cnblogs.com/herosoft/p/8405451.html   https://blog.csdn.net/qq_33206732/article/details/80017746
    //        Query query = new Query(Criteria.where("_id").is("5ee820d49f8a1b1d1479c42b"));
    //        Map record = mongoTemplate.findOne(query, Map.class, "xinhua");
    //        System.out.println(record);
    
    //        Query query = new Query(Criteria.where("time").gt(new Date("2020/06/12")));
    //        Map record = mongoTemplate.findOne(query, Map.class, "xinhua");
    //        System.out.println(record);
    
    
    //        Query query = new Query();
    //        List<Map> documents = mongoTemplate.find(query, Map.class, "xinhua");
            Query query = new Query();
            query.addCriteria(Criteria.where("GUNS_XINHUA_VERSION").is(17));
            long count = mongoTemplate.count(query, "xinhua");
            System.out.println(count);
    
    //        List<Map> documents = mongoTemplate.findAll(Map.class, "xinhua");
    //        for (Map document : documents) {
    //            System.out.println(document);
    //        }
    
    
    //        documents.forEach((key, value) -> {
    //            System.out.println(key + "==" + value);
    //        });
    
    //        Update update = new Update().set("likes", 110);
    //        mongoTemplate.updateFirst(query, update, "xinhua");
    
    //        Map<String, Object> map = new HashMap<String, Object>() {
    //            {
    //                put("time1", new Date("2012/04/15"));
    ////                put("time2", new Date("2012-04-15"));
    //                put("time3", new Date("2012/4/15"));
    //                put("sex", 1);
    //                put("many", 34.555);
    //            }
    //        };
    //        mongoTemplate.insert(map, "xinhua");
    
    
    //        List<Map> list = new ArrayList<>();
    //        list.add(map);
    //        mongoTemplate.insert(list, "xinhua");
        }
    
        @Test
        public void getTest() {
            ServerAddress serverAddress = new ServerAddress("10.1.192.130", 27017);
            List<ServerAddress> addrs = new ArrayList<>();
            addrs.add(serverAddress);
            MongoCredential credential = MongoCredential.createScramSha1Credential("xinhua", "admin", "xinhua111".toCharArray());
            List<MongoCredential> credentials = new ArrayList<>();
            credentials.add(credential);
            MongoClient mongoClient = new MongoClient(addrs, credentials);
            MongoDatabase mongoDatabase = mongoClient.getDatabase("xinhua");
            MongoCollection<Document> xinhua = mongoDatabase.getCollection("xinhua");
    
            // 插入单个文档
            Document document = new Document("wonder-group-test", "万达信息");
            xinhua.insertOne(document);
    
            // 插入多个文档
    //        List<Document> documents = new ArrayList<>();
    //        documents.add(document);
    //        xinhua.insertMany(documents);
    
            // 检索所有文档
    //        FindIterable<Document> findIterable = xinhua.find();
    //        MongoCursor<Document> mongoCursor = findIterable.iterator();
    //        while (mongoCursor.hasNext()) {
    //            System.out.println(mongoCursor.next());
    //        }
        }
    
        @Test
        public void getAggregation() {
            //封装查询条件
            List<AggregationOperation> operations = new ArrayList<>();
    //        operations.add(Aggregation.match(Criteria.where("SEX").is("1")));
    //        operations.add(Aggregation.count().as("total"));
    //        operations.add(Aggregation.group().count().as("count"));
            operations.add(Aggregation.group("SEX").count().as("count"));
            Aggregation aggregation = newAggregation(operations);
            AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "xinhua", Map.class);
            List<Map> mappedResults = results.getMappedResults();
            System.out.println(mappedResults);
    
    //        GroupOperation as = Aggregation.group("SEX").sum("payment").as("totalPayment").sum("num").as("itemNum").count().as("orderNum");
    //        Criteria criteria = Criteria.where("SEX").is(1);
    //        Aggregation customerAgg = Aggregation.newAggregation(
    //                Aggregation.project("buyerNick", "payment", "num", "tid", "userId", "address", "mobile", "orders"),
    //                Aggregation.match(criteria),
    //                Aggregation.unwind("orders"),
    //                Aggregation.group("SEX").sum("payment").as("totalPayment").sum("num").as("itemNum").count().as("orderNum"),
    //                Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC, "totalPayment"))),
    //                Aggregation.skip(startRows),
    //                Aggregation.limit(pageSize)
    //        );
        }
    
        @Test
        public void getAggregationIF() {
            // https://www.it1352.com/1637289.html   mongodb if用法
    //        Aggregation aggregation =
    //                newAggregation(
    //                        project("id").
    //                                and(when(where("status").is("A")).then(1).otherwise(0)).as("status").
    //                                and(Subtract.valueOf("end_time").subtract("start_time")).as("diffTime"),
    //                        group("$id").count().as("total").sum("status").as("live").avg("diffTime").as("chat_hrs"));
    
            // https://blog.csdn.net/w2015ei/article/details/80664220
            List<AggregationOperation> operations = new ArrayList<>();
            Criteria matchCriteria = new Criteria();
            List<Map<String, Object>> condition = new ArrayList<>();
            for (Map cond : condition) {
                switch ((String) cond.get("type")) {
                    case "-1":
                        matchCriteria.andOperator();
                        break;
                    case "0":
                        break;
                    case "1":
                    case "2":
                        break;
                    case "3":
                        break;
                }
            }
            matchCriteria.where("SEX").is("1");
            operations.add(Aggregation.match(matchCriteria));
            operations.add(Aggregation.group("SEX")
                    .count().as("cnum").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("0"), where("AGE_DX").gte("0").lte("15"))).then(1).otherwise(0)).as("d1").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("16"), where("AGE_DX").lte("30"))).then(1).otherwise(0)).as("d2").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("31"), where("AGE_DX").lte("45"))).then(1).otherwise(0)).as("d3").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("46"), where("AGE_DX").lte("60"))).then(1).otherwise(0)).as("d4").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("61"), where("AGE_DX").lte("75"))).then(1).otherwise(0)).as("d5").
                            sum(when(new Criteria().andOperator(where("AGE_DX").gte("76"), where("AGE_DX").lte("90"))).then(1).otherwise(0)).as("d6").
                            sum(when(where("AGE_DX").gte("90")).then(1).otherwise(0)).as("d7"));
            Aggregation aggregation = newAggregation(operations);
            AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "xinhua", Map.class);
            List<Map> mappedResults = results.getMappedResults();
            System.out.println(mappedResults);
        }
    
        /**
         * sql转mongodb,只能处理一些简单的查询,复杂的自己手写,要求mongodb版本4.0以上
         *
         * @throws ParseException
         */
        @Test
        public void SqlTransferMongo() throws ParseException {
            String sql1 = "select object.key1, object2.key3, object1.key4 from my_collection where object.key2 = 34 AND object2.key4 > 5";
            String sql2 = "SELECT COUNT(*) AS cnum,SEX,SUM(IF((0 <= AGE_DX AND AGE_DX >= 15),1,0)) AS d1,SUM(IF((16 <=  AGE_DX AND AGE_DX >= 30),1,0)) AS d2,SUM(IF((AGE_DX > 90),1,0)) AS d7 FROM xin_databases";
            String sql3 = "select x from db WHERE SEX >= 1 and SEX <= 3";
            String sql4 = "select x from db WHERE INHOS_DATE >= "2020/06/25" and INHOS_DATE <= "2020/07/02" OR AGE_DX >= "23" and AGE_DX <= "56" AND SEX in ("1") AND EXPDT >= "2" and EXPDT <= "6"";
            QueryConverter queryConverter = new QueryConverter.Builder().sqlString(sql4).build();
            MongoDBQueryHolder mongoDBQueryHolder = queryConverter.getMongoQuery();
            String collection = mongoDBQueryHolder.getCollection();
            Document query = mongoDBQueryHolder.getQuery();
            Document projection = mongoDBQueryHolder.getProjection();
            Document sort = mongoDBQueryHolder.getSort();
            System.out.println(collection);
            System.out.println(query);
            System.out.println(query.toJson());
            System.out.println(projection);
            System.out.println(projection.toJson());
            System.out.println(sort);
            System.out.println(sort.toJson());
    
    
            ArrayList<BasicDBObject> list = new ArrayList<>();
            String condition = "{
    " +
                    "    "$group":{
    " +
                    "        "_id":"$SEX",
    " +
                    "        "count":{$sum:1},
    " +
                    "        "d1":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","0"]},{"$lte":["$AGE_DX","15"]}]},then:1,else:0}}},
    " +
                    "        "d2":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","16"]},{"$lte":["$AGE_DX","30"]}]},then:1,else:0}}},
    " +
                    "        "d3":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","31"]},{"$lte":["$AGE_DX","45"]}]},then:1,else:0}}},
    " +
                    "        "d4":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","46"]},{"$lte":["$AGE_DX","60"]}]},then:1,else:0}}},
    " +
                    "        "d5":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","61"]},{"$lte":["$AGE_DX","75"]}]},then:1,else:0}}},
    " +
                    "        "d6":{$sum:{$cond:{if:{"$and":[{"$gte":["$AGE_DX","76"]},{"$lte":["$AGE_DX","90"]}]},then:1,else:0}}},
    " +
                    "        "d7":{$sum:{$cond:{if:{"$gt":["$AGE_DX","90"]},then:1,else:0}}}
    " +
                    "        }
    " +
                    "}";
            BasicDBObject group = BasicDBObject.parse(condition);
            String querySQL = "{"$match":" + mongoDBQueryHolder.getQuery().toJson() + "}";
            BasicDBObject match = BasicDBObject.parse(querySQL);
            list.add(match);
            list.add(group);
    
            AggregateIterable<Document> documents = mongoTemplate.getCollection("xinhua").aggregate(list);
            for (Map document : documents) {
                System.out.println(document);
            }
    
        }
    }

     

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    应用服务器安装
    datasnap的线程池
    压缩OLEVARIANT数据
    服务端日志记录
    提交主从表的多个已经修改的数据
    MySQL与PostgreSQL相比哪个更好?
    Vue入门常用指令详解
    Laravel模型事件的实现原理详解
    Git 遇到了 early EOF indexpack failed 问题
    Laravel 代码开发最佳实践
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/13463362.html
Copyright © 2011-2022 走看看