spring boot MongoTemplate常用的命令进行查询(返回某些特定字段、模糊查询、分页、包含and和or的复杂查询、聚合查询,修改)

我们在使用mongo DB数据库进行查询的时候,只使用MongoRepository进行查询,实现部分复杂的查询的时候会变得有些吃力。我们可以使用MongoTemplate实现比较复杂的查询。
首先需要配置maven依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

配置简单的application.properties文件

#uri: mongodb://username:password@ip:port/admin
spring.data.mongodb.uri=mongodb://yin:yin@localhost:27017
spring.data.mongodb.database=xc_cms

这是事先准备好的数据

在这里插入图片描述
下面对部分常用命令进行演示

 @Autowired
    MongoTemplate mongoTemplate;
 
    @Override
    public JsonVO testMongoFind() {
        JsonVO jsonVO = new JsonVO(200, "success");


        //返回只返回某些字段
        Query query4 = new Query();
        query4.fields().include("valueInt").include("valueInt2");
        List<MongoTestEntity> entityList2 = mongoTemplate.find(query4, MongoTestEntity.class, "mongoTest");
        System.out.println(entityList2);



        //返回mongno不为null 或者 ""
        Query query5 = new Query();
        List<String> testLst = new ArrayList<>();
        testLst.add("");
        testLst.add(null);
        query5.addCriteria(Criteria.where("valueStr").nin(testLst));
        List<MongoTestEntity> entityList3 = mongoTemplate.find(query5, MongoTestEntity.class, "mongoTest");
        System.out.println(entityList3);

        //模糊查询
        Query query6 = new Query();
        //如果有特殊符号使用转义符
        query6.addCriteria(Criteria.where("valueStr").regex(".*?" +"hao"+ ".*"));
        List<MongoTestEntity> entityList4 = mongoTemplate.find(query6, MongoTestEntity.class, "mongoTest");
        System.out.println(entityList4);


        //分页排序
        int pageNum = 2;
        int pageSize = 3;
        int start = (pageNum - 1) * pageSize;
        Query query = new Query();
        query.with(Sort.by(Sort.Direction.DESC, "valueInt"));
        query.skip(start).limit(pageSize);
        List<MongoTestEntity> entityList = mongoTemplate.find(query, MongoTestEntity.class, "mongoTest");

        //计算总数
        long mongoTestNum = mongoTemplate.count(query, MongoTestEntity.class, "mongoTest");
        System.out.println(mongoTestNum);

        //复杂sql的转化(in/and/or/大于/小于/等于)
        //select * from mongoTest where valueStr in ("nihao","dajiahao")
        // and valueInt>=2 and (valueInt2 =15 or time>= (now -interval 5 day))
        Query query2 = new Query();
        Criteria criteria =new Criteria();
        List<String> valueStrParam = new ArrayList<>();
        valueStrParam.add("nihao");
        valueStrParam.add("dajiahao");
        criteria.and("valueStr").in(valueStrParam).andOperator(Criteria.where("valueInt").gte(2)).
                orOperator(Criteria.where("valueInt2").is(15), Criteria.where("time")
                        .gte(LocalDateTime.now().minus(5, ChronoUnit.DAYS)));
        query2.addCriteria(criteria);
        List<MongoTestEntity> entityList1 = mongoTemplate.find(query2, MongoTestEntity.class, "mongoTest");
        System.out.println(entityList1);


        //进行聚合操作  select count(valueStr) as count,valueStr as valueStr ,sum(valueInt2) as valueInt2 from mongoTest group by valueStr
        Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("valueStr").count().as("count").
                first("valueStr").as("valueStr").sum("valueInt2").as("valueInt2"))
                ///Aggregation.newAggregationOptions().allowDiskUse(true)是用来解除mongodb 查询数据默认占用最大内存的(默认100M).不然会抛出异常:
                .withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());

        AggregationResults<AggregationVO> aggregateFrist = mongoTemplate.aggregate(aggregation, "mongoTest", AggregationVO.class);
        List<AggregationVO> mappedResults = aggregateFrist.getMappedResults();
        System.out.println(mappedResults);



        jsonVO.setData(entityList);
        return jsonVO;
    }

用mongoTemplate做更改

 @Override
    public JsonVO upsetMongoTest(MongoTestEntity mongoTestEntity){
        String result = "";
        String str = mongoTestEntity.getValueStr();
        Query query = new Query();
        query.addCriteria(Criteria.where("valueStr").is(str));
        org.bson.Document document = new org.bson.Document();
        mongoTemplate.getConverter().write(mongoTestEntity,document);
        Update update = Update.fromDocument(document);
        UpdateResult upsert = mongoTemplate.upsert(query, update, MongoTestEntity.class, "mongoTest2");
        if (upsert.getMatchedCount() > 0) {
            System.out.println("--------------:数据更改");
            result = "数据更改";

        }else {
            System.out.println("-----------:数据插入");
            result = "数据插入";
        }

        return new JsonVO(200, "success", result);
    }

采用另外一种方式来查询更改

/**
     * 测试查询更改
     */
    @Override
    public void testUpdate() {
        //查询
        int pageNum = 1;
        int pageSize = 10;

        Sort sort = Sort.by(Sort.Direction.DESC, "valueInt");
        PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, sort);

        Query query = new Query();
        query.addCriteria(createCriteria());

        List<MongoTestEntity> mongoTest = mongoTemplate.find(query.with(pageRequest), MongoTestEntity.class, "mongoTest");

        System.out.println(mongoTest);

        //更改
        Update update = new Update();
        update.set("valueStr2", "haohao");
        update.set("time", LocalDateTime.now());
        Query query2 = new Query();
        query2.addCriteria(createCriteria());
        mongoTemplate.updateMulti(query2, update, "mongoTest");


    }

    /**
     * 添加条件
     * @return
     */
    private Criteria createCriteria(){
        Criteria criteria = new Criteria();
        ArrayList<String> valueStrLst = new ArrayList<>();
        valueStrLst.add("nihao");
        valueStrLst.add("wohao");
        criteria.and("valueStr").in(valueStrLst);

        criteria.and("valueStr2").is("wohao");

        return criteria;


    }

附上使用的vo类

@Data
public class MongoTestEntity {
    @Id
    private String id;
    private Integer valueInt;

    private Integer valueInt2;

    private String valueStr;

    private LocalDateTime time;
}

@Data
public class AggregationVO {
    private String valueStr;
    private Integer count;

    private Integer valueInt2;
}

附上使用插入数据的代码

   @Override
    public JsonVO insertData(){
        JsonVO jsonVO = new JsonVO(200, "success");
        List<MongoTestEntity> entityList = new ArrayList<>();
        MongoTestEntity mongoTestEntity = new MongoTestEntity();
        mongoTestEntity.setValueInt(1);
        mongoTestEntity.setValueInt2(11);
        mongoTestEntity.setValueStr("nihao");
        mongoTestEntity.setTime( LocalDateTime.now().minus(10, ChronoUnit.HOURS));
        entityList.add(mongoTestEntity);

        MongoTestEntity mongoTestEntity2 = new MongoTestEntity();
        mongoTestEntity2.setValueInt(1);
        mongoTestEntity2.setValueInt2(15);
        mongoTestEntity2.setValueStr("wohao");
        mongoTestEntity2.setTime( LocalDateTime.now().minus(15, ChronoUnit.HOURS));
        entityList.add(mongoTestEntity2);

        MongoTestEntity mongoTestEntity3 = new MongoTestEntity();
        mongoTestEntity3.setValueInt(5);
        mongoTestEntity3.setValueInt2(15);
        mongoTestEntity3.setValueStr("dajiahao");
        mongoTestEntity3.setTime( LocalDateTime.now().minus(5, ChronoUnit.HOURS));
        entityList.add(mongoTestEntity3);


        MongoTestEntity mongoTestEntity4 = new MongoTestEntity();
        mongoTestEntity4.setValueInt(5);
        mongoTestEntity4.setValueInt2(15);

        mongoTestEntity4.setTime( LocalDateTime.now().minus(5, ChronoUnit.HOURS));
        entityList.add(mongoTestEntity4);

        mongoTemplate.insert(entityList, "mongoTest");

        return jsonVO;
    }


版权声明:本文为fajing_feiyue原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。