MongoDB基础学习(五)之在Springboot项目使用MongoTemplate进行操作

 springboot简单操作MongoDB——-增删改查 

1.引入依赖

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

2.在配置文件中进行配置

application.properties配置数据源

spring.data.mongodb.host=xxx.xxx.xxx.xxx
spring.data.mongodb.port=xxxxxx
spring.data.mongodb.database=xxxxx
spring.data.mongodb.username=xxxx
spring.data.mongodb.password=xxxxx

1.建立实体类。

 
/**
 * @Date: 2018/8/28 21:22
 * @Description:
 */

@Data
@Document("Entry") // 声明文档为Entry 
public class Entry {
 
 
    private String id;
 
    private String name;
 
    private Integer age;
 
    private String remark;
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
    public String getRemark() {
        return remark;
    }
 
    public void setRemark(String remark) {
        this.remark = remark;
    }
}

springBoot2.3 使用MongoRepository整合mongoDb

创建Dao接口

继承MongoRepository接口,第一个泛型是document文档对象,第二个参数是id的类型,一般直接设置为String类型就行了,让mongo自动生成id

@Repository
public interface EntryDao  extends MongoRepository<Entry, String> {

}

Service接口

/**
 * 使用mongoRepository接口,基本能够完成增删改查操作,包括批量插入,批量修改,模糊查询,删除所有,删除满足条件的;
 * 查询满足任一条件的数据,查询满足所有条件的数据;分页查询;查询结果排序
 */
public interface EntryService {

    /**
     * 新增,插入(不能插入相同id的数据)
     * @param po
     * @return
     */
    Entry insertEntry(Entry po);

    /**
     * 修改,如果id存在则修改,如果id不存在则新增
     * @param po
     * @return
     */
    Entry updateEntry(Entry po);

    /**
     * 插入多条
     * @param EntryList
     * @return
     */
    List<Entry> insertManyEntry(List<Entry> EntryList);

    /**
     * 查询一条(即使是有多条数据也只是返回第一条)
     * @param po
     * @return
     */
    EntryfindEntry(Entry po);

    /**
     * 查询多条数据
     * @param po
     * @return
     */
    List<Entry> findEntryList(Entry po);

    /**
     * 查询结果排序
     * @param po
     * @return
     */
    List<Entry> findEntryListSort(Entry po);

    /**
     * 查询满足任意一个条件的多条数据
     * @param po
     * @return
     */
    List<Entry> findEntryListAny(Entry po);

    /**
     * 模糊查询
     * @param po
     * @return
     */
    List<Entry> findEntryListLike(Entry po);

    /**
     * 模糊查询2
     * @param po
     * @return
     */
    List<Entry> findEntryListLike2(Entry po);

    /**
     * 分页查询
     * @param po
     * @return
     */
    Page<Entry> findEntryListByPage(Entry po, int page, int size);

    /**
     * 删除所有
     */
    void deleteAll();

    /**
     * 根据id删除
     * @param id
     */
    void deleteById(String id);

    /**
     * 判断是否存在
     * @param po
     * @return
     */
    Boolean exists(Entry po);
}

ServiceImpl 实现类


@Service
public class EntryServiceImpl implements EntryService {

    @Autowired
    private EntryDao entrydao;

    @Override
    public Entry insertEntry(Entry po) {
        // 新增
        return entrydao.insert(po);
    }

    @Override
    public Entry updateEntry(Entry po) {
        // 如果不存在则新增,存在则修改
        return entrydao.save(po);
    }

    @Override
    public List<Entry> insertManyEntry(List<Entry> EntryList) {
        return entrydao.insert(EntryList);
    }

    @Override
    public Entry findEntry(Entry po) {
        Example<Entry> of = Example.of(po);
        Optional<Entry> one = entrydao.findOne(of);
        return one.get();
    }

    @Override
    public List<Entry> findEntryList(Entry po) {
        // Example.of(po) 默认就是 ExampleMatcher.matching() 匹配模式
        return entrydao.findAll(Example.of(po));
    }

    @Override
    public List<Entry> findEntryListSort(Entry po) {
        // 构造排序器,按title字段降序排列,如果有多个字段则,分别按多个字段的进行降序
        Sort sort = Sort.by(Sort.Direction.DESC,"title");
        return entrydao.findAll(Example.of(po), sort);
    }

    @Override
    public List<Entry> findEntryListAny(Entry po) {
        // 设置为或模式,默认是且模式,或表示查询条件中的任意一个条件满足都返回。是指不同的查询字段,而不是同一个字段的不同值
        ExampleMatcher matcher = ExampleMatcher.matchingAny();
        Example<Entry> example = Example.of(po, matcher);
        return entrydao.findAll(example);
    }

    @Override
    public List<Entry> findEntryListLike(Entry po) {
        // 设置不同字段的查询方式:模糊查询
        // 必须是ExampleMatcher.matching().withMatcher("title", ExampleMatcher.GenericPropertyMatchers.contains())的方式写,
        // 不能分开写成ExampleMatcher matcher = ExampleMatcher.matching(); matcher.withMatcher("title", ExampleMatcher.GenericPropertyMatchers.contains())
        // 因为源码中就说了This instance is immutable and unaffected by this method call。
        // title字段 以包含方式查询,即sql中的 like '%关键词%'
        // description字段以查询结尾的方式查询,即sql中的 like '%关键词'
        // 测试1:"title"
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("title", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("description", ExampleMatcher.GenericPropertyMatchers.endsWith());

        // 测试2: 不写title时,默认应该是精确查询的
        /*ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("description", ExampleMatcher.GenericPropertyMatchers.endsWith());*/
        Example<Entry> example = Example.of(po, matcher);
        return entrydao.findAll(example);
    }

    public List<Entry> findEntryListLike2(Entry po) {
        // 改变默认字符串匹配方式:直接把精确查询改为模糊查询
        // 必须是ExampleMatcher.matching().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);的方式写,
        // 不能分开写成ExampleMatcher matcher = ExampleMatcher.matching(); matcher.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);

        ExampleMatcher matcher = ExampleMatcher.matching()
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);

        Example<Entry> example = Example.of(po, matcher);

        return entrydao.findAll(example);
    }

    @Override
    public Page<Entry> findEntryListByPage(Entry po, int page, int size) {
        // 改为模糊查询
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("title", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("description", ExampleMatcher.GenericPropertyMatchers.endsWith());

        // 测试2: 不写title时,默认应该是精确查询的
        /*ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("description", ExampleMatcher.GenericPropertyMatchers.endsWith());*/
        Example<Entry> example = Example.of(po, matcher);
        // 构造分页对象,带排序规则
//        Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "title");
        // 不带排序规则
        Pageable pageable = PageRequest.of(page, size);
        // 分页查询
        return entrydao.findAll(example, pageable);
    }

    @Override
    public void deleteAll() {
        entrydao.deleteAll();

    }

    @Override
    public void deleteById(String id) {
        entrydao.deleteById(id);
    }

    @Override
    public Boolean exists(Entry po) {
        return entrydao.exists(Example.of(po));
    }
}

测试
日志使用lombok, 测试工具使用SpringBootTest


@Slf4j
@SpringBootTest
public class EntryTest {
@Autowired
private EntryService entryService;

@Test
public void testInsertEntry() {
Entry po = new Entry();
// 有没有这个setId都可以,如果不设置则由mongodb自动生成一个id
//  po.setId("1");
po.setTitle("今日大事件2");
po.setDescription("今日大事件的描述2");
Entry Entry = entryService.insertEntry(po);
log.info("【新增话术】Entry:{}", Entry);
}

@Test
public void testUpdateEntry() {
Entry po = new Entry();
po.setTitle("今日大事件3");
Entry Entry = entryService.findEntry(po);
Entry.setDescription("今日大事件3修改了呀2");
EntryService.updateEntry(Entry);
log.info("【修改话术】Entry:{}", Entry);
}

@Test
public void testInsertManyEntry() {
List<Entry> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Entry po = new Entry();
po.setTitle("今日热榜" + i);
po.setDescription("今日热榜描述A" + i);
list.add(po);
}
List<Entry> Entryes = entryService.insertManyEntry(list);
log.info("【新增话术】Entry:{}", Entryes);
}

@Test
public void testFindEntry() {
Entry po = new Entry();
po.setTitle("今日大事件2");
Entry Entry = entryService.findEntry(po);
log.info("【查询话术】Entry:{}", Entry);
}

@Test
public void testFindEntryList() {
Entry po = new Entry();
po.setTitle("今日大事件2");
List<Entry> EntryList = entryService.findEntryList(po);
log.info("【查询话术】Entry:{}", EntryList);
}

@Test
public void testFindEntryListByPage() {
Entry po = new Entry();
po.setTitle("今日热榜");
Page<Entry> EntryListByPage = entryService.findEntryListByPage(po, 0, 10);
int totalPages = EntryListByPage.getTotalPages();
List<Entry> content = EntryListByPage.getContent();
int number = EntryListByPage.getSize();
int numberOfElements = EntryListByPage.getNumberOfElements();
log.info("【分页查询话术】totalPage:{} number:{} , numberOfElements:{}, Entry:{}, ", totalPages, number,numberOfElements, content);
}

@Test
public void testFindEntryListSort() {
Entry po = new Entry();
//  po.setTitle("今日大事件2");
List<Entry> EntryList = entryService.findEntryListSort(po);
log.info("【话术查询结果排序】Entry:{}", EntryList);
}

@Test
public void testFindEntryListAny() {
Entry po = new Entry();
po.setTitle("今日大事件2");
po.setDescription("今日大事件的描述3");
List<Entry> EntryList = entryService.findEntryListAny(po);
log.info("【话术查询或】Entry:{}", EntryList);
}

@Test
public void testFindEntryListLike() {
Entry po = new Entry();
po.setTitle("大事件3");
//  po.setDescription("3修改了呀2");
//  po.setTitle("今日大事件3");
List<Entry> EntryList = entryService.findEntryListLike(po);
log.info("【话术模糊查询】Entry:{}", EntryList);
}

@Test
public void testFindEntryListLike2() {
Entry po = new Entry();
po.setTitle("大");
po.setDescription("3");
//  po.setTitle("今日大事件3");
List<Entry> EntryList = entryService.findEntryListLike2(po);
log.info("【话术模糊查询】Entry:{}", EntryList);
}

@Test
public void testDeleteAll() {
EntryService.deleteAll();
}

@Test
public void testDeleteById() {
Entry po = new Entry();
po.setTitle("今日大事件2");
Entry Entry = entryService.findEntry(po);
EntryService.deleteById(Entry.getId());
log.info("【删除】Entry:{}", Entry);
}

@Test
public void testExists() {
Entry po = new Entry();
po.setTitle("今日大事件3");
Boolean exist = entryService.exists(po);
log.info("【判断是否存在】:{}", exist);
}
}

使用MongoTemplate进行简单的增删改查

 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
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 java.util.List;
 
/**
 * @Date: 2018/8/28 21:30
 * @Description:
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class EntryTest {
 
    /**
     * 直接注入mongoTemplate即可使用
     * */
    private MongoTemplate mongoTemplate;
 
    //增
    @Test
    public void add(Entry entry){
        entry.setId("1");
        entry.setName("张三");
        entry.setAge(15);
        entry.setRemark("喜欢打球、喜欢喝茶");
        //存储操作
        mongoTemplate.save(entry);
        //指定集合名
        mongoTemplate.save(entry,"人员表");
    }
 
    //删除
    @Test
    public void delete(String id){
        mongoTemplate.remove("1");
        mongoTemplate.remove("1","人员表");
        Query query = new Query();
        //拼装删除数据
        query.addCriteria(Criteria.where("id").is("1"));
        mongoTemplate.remove(query,"人员表");
        mongoTemplate.remove(query,Entry.class);
    }
    //改
    @Test
    public void edit(Entry entry){
        Query query = new Query(Criteria.where("id").is(entry.getId()));
        //拼装修改数据
        Update update = new Update();
        update.set("name","李四");
        update.set("remark","喜欢画画");
        mongoTemplate.updateFirst(query, update, Entry.class);
    }
   

     //简单查
    @Test
    public void query(String id){
        //单条
        Query query = new Query(Criteria.where("id").is(id));//可累加条件
        Entry entrY = mongoTemplate.findOne(query,Entry.class);
        //多条
        Query query2 = new Query(Criteria.where("remark").regex("喜欢"));//可累加条件
        List<Entry> entries = mongoTemplate.find(query, Entry.class);
    }
    

    //查询所有
    @Test
    public void findAll(){
     List<Entry> entries = mongoTemplate.find(Entry.class);
    }

    //根据id查询
    @Test
    public void findById(Integer id){
    Query query=new Query(Criteria.where("_id").is(id));//可累加条件
        Entry student = mongoTemplate.findOne(query, Entry.class);
    }
 
}

分页查询——此处我写了两个工具类

 
import org.springframework.data.domain.Sort;
 
import java.io.Serializable;
 
/**
 * @Auther:
 * @Date: 2018/8/22 08:48
 * @Description:
 * @Version: 1.0
 */
public class MongoDBPageModel implements Serializable {
    /**
     * @Fields: serialVersionUID
     * @Todo: TODO
     */
    private static final long serialVersionUID = 1L;
    // 当前页
    private Integer pagenumber = 1;
    // 当前页面条数
    private Integer pagesize = 10;
    // 排序条件
    private Sort sort;
    public Integer getPagenumber() {
        return pagenumber;
    }
    public void setPagenumber(Integer pagenumber) {
        this.pagenumber = pagenumber;
    }
    public Integer getPagesize() {
        return pagesize;
    }
    public void setPagesize(Integer pagesize) {
        this.pagesize = pagesize;
    }
    public Sort getSort() {
        return sort;
    }
    public void setSort(Sort sort) {
        this.sort = sort;
    }
 
}
 
import java.io.Serializable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
/**
 * @Auther:
 * @Date: 2018/8/22 10:19
 * @Description:
 * @Version: 1.0
 */
public class SpringbootMongoDBPageable implements Serializable,Pageable{
    /**
     * @Fields: serialVersionUID
     * @Todo: TODO
     */
    private static final long serialVersionUID = 1L;
 
    MongoDBPageModel page;
 
    public MongoDBPageModel getPage() {
        return page;
    }
 
    public void setPage(MongoDBPageModel page) {
        this.page = page;
    }
 
    @Override
    public Pageable first() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public int getOffset() {
        // TODO Auto-generated method stub
        return (page.getPagenumber() - 1) * page.getPagesize();
    }
 
    @Override
    public int getPageNumber() {
        // TODO Auto-generated method stub
        return page.getPagenumber();
    }
 
    @Override
    public int getPageSize() {
        // TODO Auto-generated method stub
        return page.getPagesize();
    }
 
 
    @Override
    public boolean hasPrevious() {
        // TODO Auto-generated method stub
        return false;
    }
 
    @Override
    public Pageable next() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public Pageable previousOrFirst() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public Sort getSort() {
        // TODO Auto-generated method stub
        return page.getSort();
    }
}

分页查询+分页聚合查询(多表多条件关联分页查询+结果集解析)——-依然测试类

 
/**
 * @Date: 2018/8/28 21:30
 * @Description:
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class EntryTest {
 
    /**
     * 直接注入mongoTemplate即可使用
     * */
    private MongoTemplate mongoTemplate;
 
    //分页查询
    @Test
    public void PageQuery(){
        //利用工具类拼装分页信息
        SpringbootMongoDBPageable pageable = new SpringbootMongoDBPageable();
        MongoDBPageModel pm=new MongoDBPageModel();
        pm.setPagesize(3);
        pm.setPagenumber(1);
        List<Order> orders = new ArrayList<>();  //排序信息
        orders.add(new Order(Direction.DESC, "age"));
        Sort sort = new Sort(orders);
        pm.setSort(sort);
        pageable.setPage(pm);
        //拼装查询信息
        Query query = new Query();
        Criteria criteria = new Criteria();
        query.addCriteria(criteria.where("age").gte(6).lte(18));//检索6-18岁的
        query.addCriteria(criteria.where("name").regex("文"));//模糊查询名字
        Long count = mongoTemplate.count(query, OrdersData.class);//查询总记录数
        List<Entry> list = mongoTemplate.find(query.with(pageable), Entry.class);
    }
    //分页聚合查询(多表多条件关联分页查询)
    @Test
    public void PageQuery2(){
        //mongodb中有两个表,一个是人物表 一个是宠物表,一个人可以有多个宠物
        //人物表字段为 String id, Integer age,String remark;
        //宠物表字段为 String id, String manId,String age,String remark;
        //拼装分页信息
        SpringbootMongoDBPageable pageable = new SpringbootMongoDBPageable();
        MongoDBPageModel pm=new MongoDBPageModel();
        pm.setPagesize(2);
        pm.setPagenumber(1);
        List<Order> orders = new ArrayList<>();  //排序
        orders.add(new Order(Direction.DESC, "age"));
        Sort sort = new Sort(orders);
        pm.setSort(sort);
        pageable.setPage(pm);
 
        //拼装关联信息
        LookupOperation lookupOperation = LookupOperation.newLookup().
                from("dogData").//关联表名
                localField("_id").//关联字段
                foreignField("manId").//主表关联字段对应的次表字段
                as("dogs");//查询结果集合名
 
        //拼装具体查询信息
        //次表
        Criteria ordercri = Criteria.where("dogs").not().size(0);//只查询有宠物的人
        ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation match = Aggregation.match(ordercri);
        //主表
        Criteria qqq=Criteria.where("name").regex("文");//只查询名字中带有文的人
        AggregationOperation match1= Aggregation.match(qqq);
 
        //分页查询
        Aggregation aggregation = Aggregation.newAggregation(match1,lookupOperation,match,Aggregation.sort(pageable.getSort()),//排序
                Aggregation.skip(pageable.getPageNumber()>1?(pageable.getPageNumber()-1)*pageable.getPageSize():0),//pagenumber
                Aggregation.limit(pageable.getPageSize()));//pagesize
        //总数查询
        Aggregation counts = Aggregation.newAggregation(match1,lookupOperation,match).;
        int count = mongoTemplate.aggregate(counts, "manEntry", BasicDBObject.class).getMappedResults().size();
        List<BasicDBObject> results = mongoTemplate.aggregate(aggregation, "manEntry", BasicDBObject.class).getMappedResults();
        //查询出的结果集为BasicDBObject类型
        //解析过程
        for (BasicDBObject b :results
                ) {
            //转化为jsonobject对象
            JSONObject jsonObject = new JSONObject(b);
            String id = jsonObject.get("id").toString();
            Integer age = ((int) jsonObject.get("age"));
            String remark = jsonObject.get("remark").toString();
            //转化为jsonarray
            JSONArray dogs = jsonObject.getJSONArray("dogs");
            if (dogs.size() > 0) {
                for (int i = 0; i < dogs.size(); i++) {
                    JSONObject job = dogs.getJSONObject(i);
                    String dogId = job.get("id").toString();
                    String manId = job.get("manId").toString();
                    }
                }
 
            }
    }
 
 
}

4.在Controller中进行引入

@Autowired
private MongoTemplate mongoTemplate;

带条件查询

        Query query = new Query();
        if (code!=0) {
            query.addCriteria(Criteria.where("buiness_core").is(code));//is:等于
        }
        // query.fields().exclude("details.details");//exclude:不需要查询这个字段
        List<Station> list = mongoTemplate.find(query, 对应实体类的名称.class);//fin:查询集合中所有的对象

多表联查

    /**
     * 两表联查
     *
     * @return
     */
    @GetMapping("/DeviceAndStation")
    public Object findStudentAndGrade(String stationId){
        LookupOperation lookupOperation=LookupOperation.newLookup().
                from("t_wlw_station").  //关联从表名
                        localField("station_id").     //主表关联字段
                        foreignField("_id").//从表关联的字段
                        as("DeviceAndStation");   //查询结果名
//带条件查询可以选择添加下面的条件

        Aggregation aggregation=Aggregation.newAggregation(lookupOperation);
        List<Map> results = mongoTemplate.aggregate(aggregation,"t_device", Map.class).getMappedResults();
        //上面的student必须是查询的主表名
        System.out.println(JSON.toJSONString(results));
        return results;
    }

分页查询

后端代码:

 @Override
    public Page<StrategyComment> queryPage(StrategyCommentQuery qo) {
        // totalPage  prePage nextPage
        Query query = new Query();
        Criteria criteria = new Criteria();
        if (qo.getStrategyId() != null) {
            criteria = Criteria.where("strategyId").in(qo.getStrategyId());
            query.addCriteria(criteria);
        }
        // 模糊匹配
        if (qo.getKeyword() != null) {
            String keyword = qo.getKeyword();
            String pattern = ".*" + keyword + ".*"; // 正则表达式
            criteria.orOperator(Criteria.where("strategyTitle").regex(pattern),Criteria.where("content").regex(pattern));// 多条件模糊查询
            query.addCriteria(criteria);
        }
        // totalCount
        long totalCount = mongoTemplate.count(query, StrategyComment.class);
        // 如果没数据,可以优化性能不用继续执行了
        if (totalCount == 0) {
            return Page.empty();
        }
        // data
        // 第一个参数 从 0 开始
        Sort orderBy = Sort.by(Sort.Direction.DESC, "createTime"); //倒序
        Pageable pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(),orderBy);
        query.with(pageable);
        List<StrategyComment> data = mongoTemplate.find(query, StrategyComment.class);
        // 三个参数 List<T> content, Pageable pageable, long total
        return new PageImpl<StrategyComment>(data, pageable, totalCount);
    }

前端代码:

<div th:fragment="mongoPage" style="text-align: center;">
    <ul id="pagination" class="pagination"></ul>
    <script>
        //分页
        $(function () {
            var totalPages = [[${page.totalPages}]]
            var startPage = [[${page.pageable.pageNumber}+1]]

            $("#pagination").twbsPagination({
                totalPages: totalPages || 1,
                startPage: startPage || 1,
                visiblePages: 5,
                first: "首页",
                prev: "上页",
                next: "下页",
                last: "尾页",
                initiateStartPageClick: false,
                onPageClick: function (event, page) {
                    $("#currentPage").val(page);
                    $("#searchForm").submit();
                }
            });
        })
    </script>
</div>

多表联查

@Test
    public void saveMany() {// 批处理(10万条数据1127)(100万条条数据测试75773)qps13197
        Long startTime = System.currentTimeMillis();
        List<Aqz> aqzList = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            Aqz aqz = new Aqz();
            int random = (int) (Math.random() * 2);
            aqz.setABoolean(random == 0 ? false : true);
            aqz.setCreateDate(new Date());
            aqz.setString("string2" + i);
            aqz.setAnInt(i + 20000);
            aqz.setADouble(Math.random() * 2);
            List list = new ArrayList<>();
            list.add("aaa2" + i);
            list.add("bbb2" + i);
            list.add("ccc2" + i);
            aqz.setList(list);
            aqzList.add(aqz);
            System.out.println(i);
        }
        mongoTemplate.insertAll(aqzList);

        Long endtTime = System.currentTimeMillis();
        Long resultTime = endtTime - startTime;
        System.out.println("[总共执行耗时]" + resultTime);

    }
###分页,范围,模糊,排序###########################################################@Test
    public void saveClazz() {// 添加课堂
        Clazz clazz = new Clazz();
        clazz.setClazzName("天天课堂3");
        mongoTemplate.insert(clazz);
    }

    @Test
    public void saveStudent() {// 添加学生
        String clazzName = "天天课堂";
        Query query = new Query(Criteria.where("clazzName").is(clazzName));
        Clazz clazz = mongoTemplate.findOne(query, Clazz.class);
        Student student = new Student();
        student.setStudentName("小红2");
        student.setAge(18);
        student.setClazzId(clazz.getId());
        mongoTemplate.save(student);

    }

    @Test
    public void findOneClazz() {
        Query query = new Query(Criteria.where("_id").is("60e10203d31e2641ecb748ee"));
        Clazz clazz = mongoTemplate.findOne(query, Clazz.class);
        // clazz】】】" + clazz);
    }

    @Test
    public void findByManyStudent1() {// 多条件1
        Query query = new Query();
        query.addCriteria(Criteria.where("studentName").is("小红"));
        query.addCriteria(Criteria.where("age").is(18));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students);
    }

    @Test
    public void findByManyStudent0() {// 多条件0
        Query query = new Query(Criteria.where("studentName").is("小红"));
        query.addCriteria(Criteria.where("age").is(18));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students);
    }

    @Test
    public void findByManyStudent3() {// 多条件3
        Query query = new Query(Criteria.where("studentName").is("小红").and("age").is(18));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students);
    }

    @Test
    public void findByManyStudent2() {// 多条件2
        Student student = new Student();
        student.setStudentName("小红");
        student.setAge(18);
        Query query = new Query(Criteria.byExample(student));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students);
    }

    @Test
    public void findByManyStudentOr() {// 多条件0 or
        Query query = new Query(Criteria.where("studentName").regex("小"));
        query.addCriteria(new Criteria().orOperator(Criteria.where("age").is(18),
                new Criteria().andOperator(Criteria.where("studentName").is("小明"), Criteria.where("age").is(16))));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students);
    }


    @Test
    public void searchClazzByIn() {// in操作
        List<String> str = new ArrayList<>();
        str.add("天天课堂");
        Query query = new Query(Criteria.where("name").in(str));
        List<Clazz> clazzList = mongoTemplate.find(query, Clazz.class);
        // clazzList】】】" + clazzList);

    }

    @Test
    public void findListStudentSort() {// 排序
        Query query = new Query();
        query.with(Sort.by(Sort.Direction.DESC, "age"));
        List<Student> students = mongoTemplate.find(query, Student.class);
        // students】】】" + students);

    }

    @Test
    public void findFenYeList() {// 分页
        // 设置分页参数
        Query query = new Query();
        int currentPage = 2;// 0,1相同
        int pageSize = 2;
        // 设置分页信息
        query.limit(pageSize);
        query.skip(pageSize * (currentPage - 1));
        // query.addCriteria(Criteria.where("clazzName").regex("天"));
        List<Clazz> clazzes = mongoTemplate.find(query, Clazz.class);
        // clazzs】】】" + clazzes);
    }

    @Test
    public void update() {// 更新
        Query query = Query.query(Criteria.where("id").is("60e103fcd31e2615bcaf91ed"));// 添加查询条件
        // query.addCriteria(Criteria.where("time").gte(beginTime).lte(endTime));
        Update update = new Update();
        update.set("clazzName", "111");
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Clazz.class);
        // updateResult.toString());

    }

    @Test
    public void delete() {// 删除
        Query query = Query.query(Criteria.where("id").is("60e103fcd31e2615bcaf91ed"));
        mongoTemplate.remove(query, Clazz.class);
    }

    @Test
    public void findZongHe() {// 分页+范围+模糊查询+排序
        // 拼装查询信息
        Query query = new Query();
        query.addCriteria(Criteria.where("age").gte(6).lte(18));
        query.with(Sort.by(Sort.Direction.ASC, "age"));
        query.addCriteria(Criteria.where("name").regex("小"));
        // 模糊查询名字
        Long count = mongoTemplate.count(query, Student.class);
        // 查询总记录数
        List<Student> list = mongoTemplate.find(query, Student.class);

    }
####分组,两表三表联查###########################################################
import com.csw.mongodbspringbootdemo.entity.Chair;
import com.csw.mongodbspringbootdemo.entity.Desk;
import com.csw.mongodbspringbootdemo.entity.Room;
import com.mongodb.BasicDBObject;
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.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
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.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@SpringBootTest
@RunWith(SpringRunner.class)
public class RoomDeskRecommend {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void saveRoom() {// 添加房间
        Room room = new Room();
        room.setName("空房间2");
        room.setUnitCode(UUID.randomUUID().toString());
        mongoTemplate.save(room);
        Room room2 = new Room();
        room2.setName("空房间1");
        room2.setUnitCode(UUID.randomUUID().toString());
        mongoTemplate.save(room2);

    }

    @Test
    public void saveDesk() {// 添加桌子
        String roomName = "光明房间";
        String deskName = "5号桌子";
        Query query = new Query(Criteria.where("name").is(roomName));
        Room room = mongoTemplate.findOne(query, Room.class);
        Desk desk = new Desk();
        desk.setName(deskName);
        assert room != null;
        desk.setUnitCode(room.getUnitCode());
        mongoTemplate.save(desk);
        System.out.println(room);

        Query query2 = new Query(Criteria.where("name").is(deskName));
        Desk desk2 = mongoTemplate.findOne(query2, Desk.class);
        System.out.println(desk2);

    }

    @Test
    public void groupBy() {// group
        List<AggregationOperation> aggs = new ArrayList<>();
        // aggs.add(Aggregation.match(Criteria.where("name").is("log")));
        aggs.add(Aggregation.group("name").count().as("count"));
        aggs.add(Aggregation.project().and("_id").as("name").and("count").as("count"));

        Aggregation agg = Aggregation.newAggregation(aggs);

        AggregationResults<Map> results = mongoTemplate.aggregate(agg, Desk.class, Map.class);
        for (Map result : results) {
            System.out.println(result);
        }
    }

    @Test
    public void findMoreTable() {// 两表联查

        LookupOperation lookupOperation = LookupOperation.newLookup().from("room"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("rooms");// 查询结果集合名
        Criteria ordercri = Criteria.where("rooms").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation, matchZi);// 排序
        List<Map> results = mongoTemplate.aggregate(aggregation, "desk", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

    @Test
    public void findMoreTable2() {// 两表联查

        LookupOperation lookupOperation = LookupOperation.newLookup().from("desk"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("desks");// 查询结果集合名

        Criteria ordercri = Criteria.where("desks").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation, matchZi);// 排序
        List<Map> results = mongoTemplate.aggregate(aggregation, "room", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

    @Test
    public void findMoreTableZongHe() {// 两表联查

        int pageNumber = 2;// 0,1相同
        int pageSize = 2;
        // 拼装关联信息
        LookupOperation lookupOperation = LookupOperation.newLookup().from("room"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("ClazzStudents");// 查询结果集合名
        // 拼装具体查询信息
        // 次表
        Criteria ordercri = Criteria.where("ClazzStudents").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        // 主表
        Criteria qqq = Criteria.where("name").regex("号");// 只查询名字中带有文的人
        AggregationOperation matchFu = Aggregation.match(qqq);
        // 分页查询
        Aggregation aggregation = Aggregation.newAggregation(matchFu, lookupOperation, matchZi,
                Aggregation.sort(Sort.Direction.DESC, "name"),
                Aggregation.skip(pageSize > 1 ? (pageNumber - 1) * pageSize : 0), Aggregation.limit(pageSize));// 排序
                                                                                                                // Aggregation.skip(pageable.getPageNumber()>1?(pageable.getPageNumber()-1)*pageable.getPageSize():0),//pagenumber
        // 分页
        /*
         * Aggregation.skip(pageSize>1?(pageNumber-1)*pageSize:0);
         * Aggregation.limit(pageSize);
         */
        // Aggregation.group("name");

        // 总数查询
        Aggregation counts = Aggregation.newAggregation(matchFu, lookupOperation, matchZi);
        int count = mongoTemplate.aggregate(counts, Desk.class, BasicDBObject.class).getMappedResults().size();
        System.out.println("【count】" + count);
        List<Map> results = mongoTemplate.aggregate(aggregation, "desk", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

    /*
     * public PageResult<T> pagination(Class<T> clazz, int pageSize, int pageNum,
     * Query query) { long total = this.mongoTemplate.count(query, clazz); Integer
     * pages = (int)Math.ceil((double)total / (double)pageSize); if (pageNum <= 0 ||
     * pageNum > pages) { pageNum = 1; } int skip = pageSize * (pageNum - 1);
     * query.skip(skip).limit(pageSize); List<T> list = mongoTemplate.find(query,
     * clazz); PageResult pageResult = new PageResult(); pageResult.setTotal(total);
     * pageResult.setPages(pages); pageResult.setPageSize(pageSize);
     * pageResult.setPageNum(pageNum); pageResult.setList(list); return pageResult;
     * }
     */
    @Test
    public void saveChair() {// 添加椅子
        String roomName = "光明房间";
        String chairName = "1号椅子";
        Query query = new Query(Criteria.where("name").is(roomName));
        Room room = mongoTemplate.findOne(query, Room.class);
        Chair chair = new Chair();
        chair.setName(chairName);
        assert room != null;
        chair.setUnitCode(room.getUnitCode());
        mongoTemplate.save(chair);

    }

    @Test
    public void findMoreTable3_0() {// 三表联查测试,第一个表关联第二个人表(关联字段1),第一个表关联第三个表(关联字段1)

        LookupOperation lookupOperation = LookupOperation.newLookup().from("desk"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("desks");// 查询结果集合名

        Criteria ordercri = Criteria.where("desks").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        LookupOperation lookupOperation2 = LookupOperation.newLookup().from("chair"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("chairs");// 查询结果集合名

        Criteria ordercri2 = Criteria.where("chairs").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi2 = Aggregation.match(ordercri2);
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation, matchZi, lookupOperation2, matchZi2);// 排序
        List<Map> results = mongoTemplate.aggregate(aggregation, "room", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

    // 数据模拟
    @Test
    public void findMoreTable3_1() {// 三表联查测试,第一个表关联第二个人表(关联字段1),第一个表关联第三个表(关联字段2)

        LookupOperation lookupOperation = LookupOperation.newLookup().from("desk"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("desks");// 查询结果集合名

        Criteria ordercri = Criteria.where("desks").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        LookupOperation lookupOperation2 = LookupOperation.newLookup().from("chair"). // 关联表名
                localField("lastCode"). // 主关联字段
                foreignField("lastCode").// 从表关联字段对应的次表字段
                as("chairs");// 查询结果集合名

        Criteria ordercri2 = Criteria.where("chairs").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi2 = Aggregation.match(ordercri2);
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation, matchZi, lookupOperation2, matchZi2);// 排序
        List<Map> results = mongoTemplate.aggregate(aggregation, "room", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

    // 数据模拟
    @Test
    public void findMoreTable3_3() {// 三表联查测试,第一个表关联第二个人表(关联字段1),第二个表关联第三个表(关联字段2)
        LookupOperation lookupOperation = LookupOperation.newLookup().from("room"). // 关联表名
                localField("unitCode"). // 主关联字段
                foreignField("unitCode").// 从表关联字段对应的次表字段
                as("rooms");// 查询结果集合名

        Criteria ordercri = Criteria.where("rooms").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi = Aggregation.match(ordercri);
        LookupOperation lookupOperation2 = LookupOperation.newLookup().from("chair"). // 关联表名
                localField("rooms.lastCode"). // 主关联字段
                foreignField("lastCode").// 从表关联字段对应的次表字段
                as("chairs");// 查询结果集合名

        Criteria ordercri2 = Criteria.where("chairs").not().size(0);// 只查询有宠物的人
        // ordercri.and("age").gte(1).lte(5);//只查询1岁到5岁的宠物
        AggregationOperation matchZi2 = Aggregation.match(ordercri2);
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation, matchZi, lookupOperation2, matchZi2);// 排序
        List<Map> results = mongoTemplate.aggregate(aggregation, "desk", Map.class).getMappedResults(); // 查询出的结果集为BasicDBObject类型
        for (Map result : results) {
            System.out.println(result);
        }
    }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值