文章目录

  • 前言
  • 一、搭建项目
  • 二、开始编写java代码
  • 1. 新增
  • 2.查询
  • 3. 修改
  • 4. 删除
  • 5.根据条件查询
  • 6. 关联查询
  • 7. 索引相关
  • 总结



前言

MongoTemplate 相关操作 CRUD,聚合查询等;


一、搭建项目

  • springboot项目创建
  • 引入mongo 依赖
  • docker 安装好mongo数据库
  • 配置yml 链接mongo
spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 27017
      database: test

pom/gradle MongoTemplate 版本: 2.6.3

spring-boot-starter-data-mongodb

mongo可视化工具 robo3t

Mongodb学习笔记2_java


Mongodb学习笔记2_List_02

二、开始编写java代码

1. 新增

@Autowired
  MongoTemplate mongoTemplate;
  
  @Test
  void add() {
        List<ApplicationEntity> applicationEntityList = init();
        Collection<ApplicationEntity> applicationEntities = mongoTemplate.insert(applicationEntityList, ApplicationEntity.class);
        log.info("存储成功: {}", JSONUtil.toJsonStr(mongoTemplate.findAll(ApplicationEntity.class)));
    }
    
	private List<ApplicationEntity> init() {
        List<ApplicationEntity> applicationEntityList = CollectionUtil.newArrayList();
        for (int i = 0; i < 2; i++) {
            String id = IdUtil.fastSimpleUUID();
            String name = "第" + RandomUtil.randomNumbers(2) + "个应用";
            ApplicationEntity applicationEntity = ApplicationEntity.builder()
                    .id(id)
                    .name(name)
                    .orgName(name)
                    .icon("https://www.baidu.com")
                    .status(RandomUtil.randomBoolean() ? "启用" : "禁用")
                    .type("application")
                    .build();
            applicationEntityList.add(applicationEntity);
        }
        return applicationEntityList;
    }

实体具体内容

Mongodb学习笔记2_学习_03

2.查询

@Autowired
    MongoTemplate mongoTemplate;

    @Test
    void queryField() {
        Query query1 = new Query();
        query1.fields().include("orgName", "name");
        List<ApplicationEntity> applicationEntities = mongoTemplate.find(query1, ApplicationEntity.class);
        System.out.println(JSONUtil.toJsonStr(applicationEntities));
    }

1 include 查询指定字段,可以不指定,查询所有字段
2 ApplicationEntity 对应mongo数据库中的一个document

3. 修改

找到要修改的,并修改

@Test
    void update() {
        ApplicationDto applicationDto = new ApplicationDto();

        applicationDto.setId("b8cbf05d102e454784ab85f23704bfb7");
        applicationDto.setName("测试");
        applicationDto.setStatus("启用");
        applicationDto.setIcon("www.tupian");

        Query query = new Query(Criteria.where("id").is(applicationDto.getId()));
        Update update = new Update();
        update.set("fileUrl", applicationDto.getIcon());
        update.set("name", applicationDto.getName());
        update.set("status", applicationDto.getStatus());
        mongoTemplate.updateFirst(query, update, ApplicationEntity.class);
        List<ApplicationEntity> all = mongoTemplate.findAll(ApplicationEntity.class);
        System.out.println(JSONUtil.toJsonStr(all));
    }

4. 删除

找到并删除

Criteria criteria = Criteria.where("pid").is(applicationDto.getId());
    mongoTemplate.findAllAndRemove(new Query(criteria), MenuNavigationEntity.class);

5.根据条件查询

相当于
select * from a where id=1 or id =2;

@Test
    void queryCondition() {
        Query query1 = new Query(new Criteria()
                .orOperator(Criteria.where("id").is("923406"), Criteria.where("id").is("3518177")));
        List<MenuNavigationEntity> menuNavigationEntityList = mongoTemplate.find(query1, MenuNavigationEntity.class);
        System.out.println(JSONUtil.toJsonStr(menuNavigationEntityList));
    }

6. 关联查询

相当于
select *
from a
left join b on a.id = b.pid;

@Test
    void queryLink() {

        LookupOperation lookupOperation = LookupOperation.newLookup()
                .from("menu_navigation")// 副表名称
                .localField("_id")// 主表关联字段
                .foreignField("pid")// 副表关联字段
                .as("menu_navigation");// 副表别名


        // 聚合条件
        Aggregation aggregation = Aggregation.newAggregation(lookupOperation,
                Aggregation.match(Criteria.where("menu_navigation.pid")// 副表关联的主表条件
                        .is("b8cbf05d102e454784ab85f23704bfb7")));

        AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(aggregation, ApplicationEntity.class,
                JSONObject.class);// 条件  主表类型  结果类型

        List<JSONObject> mappedResults = aggregate.getMappedResults();
        System.out.println(JSONUtil.toJsonStr(mappedResults));
    }

7. 索引相关

@Test
    void index() {
        MongoCollection<Document> collection = mongoTemplate.getCollection("application");

        collection.createIndex(new Document("id", "hashed"), new IndexOptions().name("index_id"));
        // 唯一索引
        collection.createIndex(new Document("id", "hashed"), new IndexOptions().unique(true).name("index_id"));
        // 删除指定索引
        collection.dropIndex("index_id");
        // 删除所有索引
        collection.dropIndexes();
    }

总结

主要是展示了 MongoTemplate 中的CRUD的常规操作和 关联查询,之后会继续学习~~

还有个问题,就是我无法从已经标记为 文档的实体中获取 集合名称嘛? 现在我的代码中的集合名称都是字符串

还有就是字段名称也都是字符串,可以从这个 document 中获取嘛?

Mongodb学习笔记2_List_04


记录几个mongo的工具的 原生语句,模糊查询

// 模糊匹配createTime   是以 2019-07-23 开头
db.getCollection('driver_online_record').find({"createTime" : /^2019-07-23/})
 
// 模糊匹配createTime   包含 2019-07-23
db.getCollection('driver_online_record').find({"createTime" : /2019-07-23/})
 
// 模糊匹配createTime   是以 2019-07-23 结尾
db.getCollection('driver_online_record').find({"createTime" : /2019-07-23$/})
 
// 模糊匹配createTime   包含aaa  切忽略大小写
db.getCollection('driver_online_record').find({"createTime" : /aaa/i})

// 模糊匹配某个字段内容为json,再次根据json中的key模糊查询
  db.getCollection("driver_online_record").find({"value.FilePath":/1234/})
  其中value 自身为一个json,FilePath为其中的一个key
  value内容
  {
        "FilePath" : "1234567",
        "IsWeb" : true
  }