springboot 学习之路 14(整合mongodb的Api操作)

springboot整合mongodb:

  mongodb的安装权限配置  请点击连接参考

mongodb集成 :

  第一步:引如pom文件 

    

  第二步:配置文件配置mongodb路径:

    

 

  第三步:关于mongodb的api操作整理如下:(这是根据springboot1.5.13版本做的整理,springboot2.x系列对mongodb的变动较大,后期我会整理发布)

  

package com.xf.water.springboot_mongdb;

import com.mongodb.*;
import com.xf.water.springboot_mongdb.entity.A;
import com.xf.water.springboot_mongdb.entity.MaxValue;
import com.xf.water.springboot_mongdb.entity.Sl6512014;
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.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author : huhy on 2018/7/31.
 * @Project_name:springboot_self_gitlab
 * @LOCAL:com.xf.water.springboot_mongdb
 * @description:mongodb的操作
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbUtilsTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public  void test(){
        Query query6 = new Query(Criteria.where("a").lte("9"));
        //设置安装某一个子段进行降序
        query6.with(new Sort(Sort.Direction.DESC,"a"));
        query6.maxScan(6).skip(0);
        List<A> a = mongoTemplate.find(query6, A.class, "a");
        for (A a1 : a) {
            System.out.println(a1);
        }
    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/7/31 17:03 
     * @Description: 获取当前mongodb中的使用库和当前数据库的链接测试
     */
    @Test
    public  void testConnAndMongodb(){
        /**
         * mongoTemplate.getDb()   获取当前数据库
         * mongoTemplate.dropCollection("a")   删除集合
         * 创建集合:  根据类型或者直接指定集合名创建    同时可是设置集合内部的参数信息,大小,文档类型等
         *      <T> DBCollection createCollection(Class<T> var1);
         *      <T> DBCollection createCollection(Class<T> var1, CollectionOptions var2);
         *      DBCollection createCollection(String var1);
         *      DBCollection createCollection(String var1, CollectionOptions var2);
         * 集合是否存在:
         *      <T> boolean collectionExists(Class<T> var1);   根据类型判断
         *      boolean collectionExists(String var1);          根据集合名判断
         * mongoTemplate.getCollectionNames();   获取所有集合名的列表
         */
        System.out.println(mongoTemplate.getDb());
        MongoClientURI mongoClientURI = new MongoClientURI("mongodb://yang:123456@localhost:27017/huhy");
        MongoClient mongoClient = new MongoClient(mongoClientURI);
        System.out.println(mongoClient);
        mongoTemplate.dropCollection("a");
        mongoTemplate.createCollection(A.class);
        mongoTemplate.collectionExists("a");
        mongoTemplate.getCollectionNames();
    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/8/1 14:02 
     * @Description: 测试mongoTemplate的CRUD操作
     */
    @Test
    public void testMongdbTemplateCrud(){
        /**
         * 添加文档主要介绍两种方式:
         *  mongoTemplate.insert("实体对象","集合名");   往集合插入数据的方式
         *  mongoTemplate.save(对象,集合名(可省略));  参数必须是对象
         *      insert和save都适用
         *          不写集合名,默认对象类名作为集合名(如实体类是A  集合名是a)
         *          写集合名,则把数据写到对应集合下
         *          1.void save(Object var1);                传入对象,不传集合名
         *          2.void save(Object var1, String var2);   传入对象,传集合名
         *          3.void insert(Object var1);              传入对象,不传集合名
         *          4.void insert(Object var1, String var2); 传入对象,传集合名
         *          5.void insert(Collection<? extends Object> var1, Class<?> var2);  下面三个方法是批量插入的实现方法
         *          6.void insert(Collection<? extends Object> var1, String var2);
         *          7.void insertAll(Collection<? extends Object> var1);
         * 查询mongodb的操作:
         *      find 和findone方法都有两种实现
         *          1.List<T> find(Query var1, Class<T> var2)               不指定集合名
         *          2.List<T> find(Query var1, Class<T> var2, String var3)  指定集合名
         *          3.<T> T findOne(Query var1, Class<T> var2);             不指定集合名
         *          4.<T> T findOne(Query var1, Class<T> var2, String var3);指定集合名
         *           eg。
         *              maxvalue在数据库中就对应一个集合,可以不指定集合名直接查询
         *              Sl6512014 在数据对应很多集合  必须知道集合名才能查询出数据
         *
         *        findall
         *              1.<T> List<T> findAll(Class<T> var1);   根据类型查询所有
         *              2.<T> List<T> findAll(Class<T> var1, String var2);  查询集合下的该类型数据
         *
         *       findById:
         *              <T> T findById(Object var1, Class<T> var2);                 var1  是mongodb的_id子段值
         *              <T> T findById(Object var1, Class<T> var2, String var3);    指定集合名
         *  更新操作:
         *         updateFirst  更新符合条件的第一条   updateMulti  更新多个,符合条件都会更改
         *           //修改第一条符合条件数据
         *           1.WriteResult updateFirst(Query var1, Update var2, Class<?> var3);                 指定类型
         *           2.WriteResult updateFirst(Query var1, Update var2, String var3);                   更新操作指定集合名
         *           3.WriteResult updateFirst(Query var1, Update var2, Class<?> var3, String var4);    详细指定类型和集合名
         *           //批量修改
         *           4.WriteResult updateMulti(Query var1, Update var2, Class<?> var3);                 指定类型
         *           5.WriteResult updateMulti(Query var1, Update var2, String var3);                   指定集合名
         *           6.WriteResult updateMulti(Query var1, Update var2, Class<?> var3, String var4);    详细指定类型和集合名
         *           //同updateFirst
         *           7.WriteResult upsert(Query var1, Update var2, Class<?> var3);
         *           8.WriteResult upsert(Query var1, Update var2, String var3);
         *           9.WriteResult upsert(Query var1, Update var2, Class<?> var3, String var4);
         * 删除操作:
         *           1.WriteResult remove(Object var1);
         *           2.WriteResult remove(Object var1, String var2);
         *           3.WriteResult remove(Query var1, Class<?> var2);                根据条件删除
         *           4.WriteResult remove(Query var1, Class<?> var2, String var3);   详细指定类型和集合名进行删除
         *           5.WriteResult remove(Query var1, String var2);                 指定集合名进行删除
         *  其他一些操作:简单介绍:
         *          //查询出后删除
         *            <T> List<T> findAllAndRemove(Query var1, String var2);    指定集合名
                      <T> List<T> findAllAndRemove(Query var1, Class<T> var2);   指定类型
                      <T> List<T> findAllAndRemove(Query var1, Class<T> var2, String var3); 在集合下查询删除的类型数据
                    //查处后修改
                     <T> T findAndModify(Query var1, Update var2, Class<T> var3);    指定修改类型
                     <T> T findAndModify(Query var1, Update var2, Class<T> var3, String var4);  在集合下修改的数据类型
                     <T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4);
                     <T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4, String var5);
                     <T> T findAndRemove(Query var1, Class<T> var2);
                     <T> T findAndRemove(Query var1, Class<T> var2, String var3);
                    //判断是否存在
                     boolean exists(Query var1, String var2);
                     boolean exists(Query var1, Class<?> var2);
                     boolean exists(Query var1, Class<?> var2, String var3);
         */
        //insert操作
        //mongoTemplate.save(new A("1","2","3"));
        //mongoTemplate.insert(new A("1","2","3"));
        Query query = new Query(Criteria.where("a").is("11"));
        //find操作
        /*Sl6512014 sl6512014_1 = mongoTemplate.findOne(query, Sl6512014.class);
        Sl6512014 sl6512014_2 = mongoTemplate.findOne(query, Sl6512014.class,"1");
        List<Sl6512014> sl6512014_3 = mongoTemplate.find(query, Sl6512014.class);
        List<Sl6512014> sl6512014_4 = mongoTemplate.find(query, Sl6512014.class,"1");
        System.out.println(sl6512014_1);*/
        //update操作
       /* Update update= new Update();
        A a = mongoTemplate.findOne(query, A.class);
        System.out.println(a);
        update.set("a","1");*/
        //更新两种方式
        //mongoTemplate.updateFirst(query,update,A.class);
        //mongoTemplate.updateFirst(query,update,"a");
       // mongoTemplate.updateMulti(query,update,"a");
        //mongoTemplate.upsert(query,update,A.class);
        //mongoTemplate.remove(query,"a");

        //测试一些其他方法
        System.out.println(mongoTemplate.findById("5b615babec6032159050d879",A.class));

    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/7/31 17:17 
     * @Description: DBCollection下的简单使用
     */
    @Test
    public void testDBCollection(){
        /**
         * mongoTemplate.getCollection("error")   获取集合  一般获取之前判断是否存在
         * collection.getCount()    集合下又有多少数据
         * collection.find().next()  获取集合的第一条符合要求的数据
         * collection.getFullName()  返回当前库+集合的名字组合
         * collection.getName()   返回集合名
         * collection.rename("fail")   修改集合名
         * collection.distinct("ut")    返回值是list集合,返回的是ut的集合,并进行去重
         *  collection.createIndex("huhy")   在error集合上创建一个index 名字是huhy_1   不存在就创建

         */
        DBCollection collection = mongoTemplate.getCollection("error");
        //这个集合下的数据量
        System.out.println(collection.getCount());
        //返回值是list集合,返回的是ut的集合,并进行去重
        List serial = collection.distinct("ut");
        System.out.println(serial);
        DBCursor dbObjects = collection.find();
        //next只会查询出符合条件的第一个数据
        System.out.println(dbObjects.next());
        //返回的库名+集合名
        String fullName = collection.getFullName();
        System.out.println(fullName);
        //返回的集合名
        System.out.println(collection.getName());
        System.out.println(collection.getHintFields());
        long count = collection.count();
        System.out.println(count);

       // 有四种创建索引的方式,自己看api
        collection.createIndex("yang");


    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/8/1 9:40 
     * @Description:Query的用法
     *     maxvalue在数据库中就对应一个集合,可以不指定集合名直接查询
     *     Sl6512014 在数据对应很多集合  必须知道集合名才能查询出数据
     */
    @Test
    public  void testMongodbQuery(){
        /**
         * is相当于等于
         * in相当于sql中的in
         * ne相当于不等于
         * orOperator接受多个条件,组成or逻辑  addOperator同理
         * Criteria.where("author").is("mongodb")  author = mongodb的数据
         * Criteria.where("serial").lte(500).and("st").is("1703230781").and("c").in("5.7")   多条件的查询
         * Criteria.where("st").exists(true)   判断这个字段存在
         * Criteria.where("serial").ne(1)    不等于1的数据
         * Criteria.where("serial").nin(1)    nin 不在这个范围中
         * Criteria.where("serial").is(3).orOperator().is().andOperator() 追加or条件或者and条件
         * Criteria.where("a").regex("1")   模糊查询   可以用正则表达式
         * query6.with(new Sort(Sort.Direction.DESC,"a"));  按照a字段把结果降序
         * query6.skip(n);    跳过结果集的第n个   超过总条数就是啥都不输出   n<=0  时 查询到结束不跳过
         * query6.skip(n).limit(m)   跳过n条并显示m条记录
         *  query6.addCriteria(Criteria.where("b").is("11"));   再加条件  查询子段不能是上一个query查询过的子段
         *  query6.maxScan(6).skip(-2);   先截取六条数据再跳过两条
         * */
        //通过整个mongodb中查询author = mongodb的数据,返回的一个对象
        Query query = new Query(Criteria.where("author").is("mongodb"));
        List<MaxValue> maxValues = mongoTemplate.find(query, MaxValue.class);
        System.out.println(maxValues.size());

        //Sl6512014在数据库中对应很多集合,在查询中要指定集合名
        Query query1 = new Query(Criteria.where("serial").is(3));
        List<Sl6512014> sl6512014s = mongoTemplate.find(query1, Sl6512014.class,"1");
        System.out.println(sl6512014s.size());

        // lte -- <=    lt  ---  <    gt ---  >    lgt----  >=
        Query query2 = new Query(Criteria.where("serial").lte(1500));
        List<Sl6512014> sl6512014s2 = mongoTemplate.find(query2, Sl6512014.class,"1703230781");
        System.out.println(sl6512014s2.size());

        //多条件的查询  and 增加条件,in 判断符合条件的数据
        Query query3 = new Query(Criteria.where("serial").lte(500).and("st").is("1703230781").and("c").in("5.7"));
        List<Sl6512014> sl6512014s3 = mongoTemplate.find(query3, Sl6512014.class,"1703230781");
        System.out.println(sl6512014s3.size());

        Query query4 = new Query(Criteria.where("st").exists(true));
        List<Sl6512014> sl6512014s1 = mongoTemplate.find(query4, Sl6512014.class, "1703230781");
        System.out.println(sl6512014s1.size());
        //Criteria.where("serial").is(3).orOperator().is().andOperator()
        Query query5 = new Query(Criteria.where("serial").is(3));
        List<Sl6512014> sl6512014s5 = mongoTemplate.find(query5, Sl6512014.class, "1");
        System.out.println(sl6512014s5.size());
        //regex还可以用正则
        Query query6 = new Query(Criteria.where("a").lte("9"));
        //设置安装某一个子段进行降序
        query6.with(new Sort(Sort.Direction.DESC,"a"));
        query6.skip(3);
        List<A> a = mongoTemplate.find(query6, A.class, "a");
        for (A a1 : a) {
            System.out.println(a1);
        }
    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/8/1 13:34 
     * @Description: mongodb的高级用法,分组等操作
     */
    @Test
    public void testMongodbGroup(){
        Criteria criteria = Criteria.where("a").in("1","2","3","4");
        GroupOperation groupOperation = Aggregation.group("a").last("a").as("a").last("b").as("b").last("c").as("c");
        Aggregation agg = Aggregation.newAggregation(A.class,Aggregation.match(criteria),groupOperation);
        AggregationResults<A> a = mongoTemplate.aggregate(agg, "a", A.class);
        List<A> mappedResults = a.getMappedResults();
        for (A mappedResult : mappedResults) {
            System.out.println(mappedResult);
        }
    }
    /**
     * @author huhy
     * @ClassName:MongodbUtilsTest
     * @date 2018/8/1 17:22
     * @Description: 分组
     */
    public  List<Sl6512014> selectDataByGroupFildes(String collectionName,String... fildes){
        Aggregation agg = Aggregation.newAggregation(
                // 第一步:挑选所需的字段,类似select *,*所代表的字段内容
                Aggregation.project("_id", "serial", "ut", "st", "tt", "pj",
                        "pt", "va", "vt", "z","zt","sbl1","turb","stt"),
                // 第二步:sql where 语句筛选符合条件的记录
               /* Aggregation.match(
                        Criteria.where("companyName").is(companyName).and("addedDate").gte(startTime).lte(endTime)),*/
                // 第三步:分组条件,设置分组字段
                Aggregation.group(fildes)
                        .count().as("allCount")// 增加COUNT为分组后输出的字段
                        .last("_id").as("id").last("serial").as("serial").last("ut").as("ut")
                        .last("st").as("st").last("tt").as("tt").last("pj").as("pj")
                        .last("pt").as("pt").last("va").as("va")
                        .last("vt").as("vt").last("z").as("z")
                        .last("zt").as("zt").last("sbl1").as("sbl1")
                        .last("turb").as("turb").last("stt").as("stt"),
                // 第四步:重新挑选字段
                Aggregation.project("id", "serial", "ut", "st", "tt", "pj",
                        "pt", "va", "vt", "z","zt","sbl1","turb","stt")
        );
        AggregationResults<Sl6512014> results = mongoTemplate.aggregate(
                agg, collectionName, Sl6512014.class);
        List<Sl6512014> mappedResults = results.getMappedResults();
        return mappedResults;
    }


}
原文地址:https://www.cnblogs.com/huhongy/p/9402558.html