1.准备环境

新建一个Springboot项目

spring mongodb 8小时时间差 spring.data.mongodb.uri_数据库


spring mongodb 8小时时间差 spring.data.mongodb.uri_数据库_02


spring mongodb 8小时时间差 spring.data.mongodb.uri_Test_03


spring mongodb 8小时时间差 spring.data.mongodb.uri_mongodb_04


点击finish完成项目的搭建

spring mongodb 8小时时间差 spring.data.mongodb.uri_mongodb_05

2.配置连接参数

# application.properties 
# 配置数据库连接
#格式: mongodb://账号:密码@ip:端口/数据库?认证数据库 
spring.data.mongodb.uri=mongodb://root:admin@localhost/mongotest?authSource=admin 
#配置MongoTemplate的执行日志
logging.level.org.springframework.data.mongodb.core=debug

3.domain

@Setter@Getter@ToString
@AllArgsConstructor
@NoArgsConstructor
@Document("users")//设置文档所在的集合
public class User {
    @Id//文档的id使用ObjectId类型来封装,并且贴上@Id注解
    private ObjectId _id;
    private  Long id ;
    private String name;
    private Integer age;
}

4.MongoRepository

该接口对MongoDB数据的常用操作进行了封装,我们只需要写个接口去继承该接口就能直接拥有的CRUD等基本操作,再学习下JPA的方法命名规范,可以毫不费力的完成各种复杂的高级操作

/** 自定义一个接口继承MongoRepository,
 * 泛型1:domain类型
 * 泛型2:文档主键类型
 * 贴上@Repository注解,底层会创建出动态代理对象,交给Spring管理
 * 接口继承MongoRepository,就可以直接进行简单的CRUD操作
 * @Repository,由spring框架来创建动态代理对象
 * */
@Repository
public interface UserMongoRepository extends MongoRepository<User,ObjectId>{
    // 使用Spring Data命名规范做高级查询
    List<User> findByName(String name);
}

spring mongodb 8小时时间差 spring.data.mongodb.uri_mongodb_06


(1)Spring Data方法命名规范

spring mongodb 8小时时间差 spring.data.mongodb.uri_Test_07


(2).实例代码(简单的CRUD操作)

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMongoRepositoryTest {
    @Autowired
    private UserMongoRepository repository;

    @Test
    public void testSaveOrUpdate() throws Exception {
        User user = new User();
        user.setId(9L);
        user.setName("伊伊");
        user.setAge(17);
        // 主键为null则新增,不为null则更新
        repository.save(user);
    }
    //删除一个文档
    @Test
    public void testDelete() throws Exception {
        repository.deleteById(new ObjectId("5e9a990232fdb326c79ae329"));
    }
    //查询一个文档
    @Test
    public void testGet() throws Exception {
        Optional<User> optional = repository.findById(new ObjectId("5e9a6f73a0efdb355c004152"));
        optional.ifPresent(System.out::println);//User(_id=5e9a6f73a0efdb355c004152, id=1, name=伊伊, age=18)
    }
    //查询所有文档
    @Test
    public void testList() throws Exception {
        //查询所有文档
        List<User > list = repository.findAll();
        list.forEach(System.err::println);
    }
    //根据name来查询
    @Test
    public void testFindByName() throws Exception {
        List<User> list = repository.findByName("伊伊");
        list.forEach(System.out::println);
    }
}

5.MongoTemplate

该对象有SpringBoot完成了自动配置,存入Spring容器中,我们直接注入就可以使用了,依靠该对象能完成任何的MongoDB操作,一般和MongoRepository分工合作,多数用于复杂的高级查询以及底层操作

//注入MongoTemplate 
@Autowired 
private MongoTemplate template;

(1).条件限定
Query对象用于封装查询条件,配合Criteria一起使用,来完成各种条件的描述

//一个Criteria对象可以理解为是一个限定条件
 Criteria.where(String key).is(Object val); //设置一个等值条件 Criteria.orOperator(Criteria ...); //设置一组或的逻辑条件 
 //模糊查询(了解) 
 Criteria.where(String key).regex(String regex); //使用正则表达式匹配查询 
 注意:
 Criteria对象可以由其静态方法和构造器获取 
 Criteria封装了所有对条件的描述,常见的有以下方法
  lt / lte / gt / gte / ne / ...

最后通过Query对象的addCriteria把条件封装到Query对象中

Query对象.addCriteria(Criteria criteria); //添加查询条件 
Query对象.skip(start).limit(pageSize); //分页查询

(2).API方法

//根据条件查询集合中的文档 
List<T> mongoTemplate.find(Query query, Class<T> type, String collectionName);

(3).实例代码

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

    //分页查询文档,显示第2页,每页显示3个,按照id升序排列
    @Test
    public void testQuery1() throws Exception {
        //创建查询对象
        Query query = new Query();
        // 设置排序规则
        /**
         * springboot2.2.1(含)以上的版本Sort已经不能再实例化了,构造方法已经是私有的了!
         * query.with(new Sort(Sort.Direction.ASC,"id"));不可用了
         * 使用Sort.by()方法
         */
        query.with(Sort.by(Sort.Direction.ASC, "id"));
        // 设置分页信息
        query.skip(3).limit(3);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    //查询所有name为伊伊的文档
    @Test
    public void testQuery2() throws Exception {
        /*
        构建限制条件 {
            "name":"伊伊"
                }
        */
        Criteria criteria = Criteria.where("name").is("伊伊");
        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    //查询所有name为伊伊或者age<30的文档
    @Test

    public void testQuery3() throws Exception {
       /*
       构建限制条件
       {
       "$or": [
               {"name": "伊伊"},
                {"age": {"$lt": 30}}
            ]
       }*/
        Criteria criteria = new Criteria().orOperator(Criteria.where("name").is("伊伊"), Criteria.where("age").lt(30));
        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    // 查询所有name含有ha并且30<=age<=32的文档
    @Test
    public void testQuery4() throws Exception {
      /*
      构建限制条件
      {
        "$and" : [
                    {
                    "name": {"$regex": ".*wang.*"} },
                    {"age": {"$gte": 30, "$lte": 32 }
                    }
                  ]
                          }
                          */
        Criteria criteria = new Criteria().andOperator(Criteria.where("name").regex(".*ha.*"), Criteria.where("age").gte(30).lte(32));
        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }
}