1、配置

1.1、pom.xml

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

1.2、 application.yml 配置

spring:
  data:
    mongodb:
      host: 192.168.20.101
      port: 27017
      database: test
      username: accountUser
      password: 123456

以上配置会报错:org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{.......

改为以下方式:

spring:
  data:
    mongodb:
      uri: mongodb://accountUser:123456@192.168.20.101:27017/test?authSource=admin    # 开启了用户验证
#      uri: mongodb://192.168.20.101:27017/test

注意:uri 中的用户必须是该数据库自己的用户, 如果使用 admin 数据库的超级用户也会报用户验证的错误。
一开始使用的用户是 admin 数据库的用户,给的权限是 readWriteAnyDatabase ,插入数据时出现 用户验证的错误。

uri 格式: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017
/database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开

authSource 是 options中的一个,表示 用户名在那个数据库上创建的,需在在该数据库验证。如果指定了实际连接的数据库,且没有设置 authSource,则authSource是实际连接的库。如果都没设置,则authSource是admin

连接方式:

2、mongoTemplate 基本使用

2.1 常用方法

mongoTemplate.findAll(Student.class): 查询Student文档的全部数据
mongoTemplate.findById(<id>, Student.class): 查询Student文档id为id的数据
mongoTemplate.find(query, Student.class);: 根据query内的查询条件查询

updateFirst(Query query, UpdateDefinition update, Class<?> entityClass) 更新匹配到的第一条
updateMulti(Query query, UpdateDefinition update, Class<?> entityClass) 更新多条
mongoTemplate.upsert(query, update, Student.class): 有就更新,无则新增

mongoTemplate.remove(student): 根据id删除
mongoTemplate.remove(query, Student.class): 删除

mongoTemplate.insert(student): 新增

2.2 Query对象

1 创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)
2 精准条件:criteria.and(“key”).is(“条件”)
模糊条件:criteria.and(“key”).regex(“条件”)
3、封装条件:query.addCriteria(criteria)
4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)
小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)
5、Query.addCriteria(new Criteria().andOperator(gt,lt));
6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

2.3 代码示例:

// 分页 使用 Pageable 查询
    // 也可 直接使用query.skip(offset).limit(count) 查询
    Pageable pageable = PageRequest.of(page, count);  // page 表示第几页,从 0 开始, count表示每页条数
    Query query = new Query();
    //动态拼接查询条件
    if(StringUtils.isNotBlank(typeCtg)){
        query.addCriteria(Criteria.where("type_ctg").is(typeCtg));
    }
    if(StringUtils.isNotBlank(type)){
        query.addCriteria(Criteria.where("type").is(type));
    }
    if(StringUtils.isNotBlank(company)){
        query.addCriteria(Criteria.where("company").is(company));
    }
    //获取总条数
    long count1 = mongoTemplate.count(query,AssetIdentifier.class);
    List<AssetIdentifier> identifierList = mongoTemplate.find(query.with(pageable), AssetIdentifier.class);  // 执行查询
public void mongoTemplateSample(FormDataApproval formDataApproval) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(formDataApproval.getId()).and("tenant_id").is(formDataApproval.getTenantId()));

        Update update = new Update();
        update.set("process_id", formDataApproval.getProcessId());

        List<FormDataApproval> list = new ArrayList<>();
        list.add(formDataApproval);

        /**
         * 数据库有,就新增, 没有,就修改
         */
        mongoTemplate.upsert(query, update, FormData.class, "formData");
  
        /**
         * 修改方法
         */
        // 无实际意义,不推荐使用
        mongoTemplate.update(FormDataApproval.class);
        mongoTemplate.updateFirst(query, update, FormDataApproval.class, "formDataApproval");
        mongoTemplate.updateMulti(query, update, FormDataApproval.class, "formDataApproval");
        mongoTemplate.findAndModify(query, update, FormDataApproval.class, "formDataApproval");

        /**
         * 查询方法
         */
        mongoTemplate.find(query, FormDataApproval.class, "formDataApproval");
        mongoTemplate.findOne(query, FormDataApproval.class, "formDataApproval");
        mongoTemplate.findAll(FormDataApproval.class, "formDataApproval");
        mongoTemplate.findById(formDataApproval.getId(), FormDataApproval.class, "formDataApproval");

        /**
         * 删除方法
         */
        mongoTemplate.remove(query, FormDataApproval.class, "formDataApproval");
        mongoTemplate.findAndRemove(query, FormDataApproval.class, "formDataApproval");
        mongoTemplate.findAllAndRemove(query, FormDataApproval.class, "formDataApproval");

        /**
         * 新增方法
         */
        mongoTemplate.save(formDataApproval, "formDataApproval"); // 同upsert(),没有新增,有修改
        mongoTemplate.insert(formDataApproval, "formDataApproval");
        mongoTemplate.insertAll(list);

}