mongodb作为一个非关系型数据库,可以说如雷贯耳。19年找工作就被问过,并且也背了一些知识点。但是最近才真正的开始在项目中使用。所以简单记录下使用方法。
首先我们当前公司用的是spring-data-mongodb。毕竟本来项目也是boot项目,使用boot的场景启动器再正常不过,下面从第一步引入依赖开始:
<!-- mongoDB -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
然后紧接着必不可少的就是参数之类的。自己随便写写吧,最简配置就是只写个地址,如下:
spring:
data:
mongodb:
uri: mongodb://XXXXXXXXX
然后首先我们对mongodb的数据结构有一个基本的理解。首先mongodb是文档存储的。其本质我觉得是类似于json 的一种kv形式,只不过这个v还是可以是kv套娃,也可以是list,int,string等等。
但是总而言之这个一定是标准的kv格式。说点题外话:mongodb中文档组成双线链表,而索引的存储是B树。
而落实到我们的实际使用中,我们比较常用的就是文档。其实本质上mongodb中文档的格式不要求强一致。是完全可以字段都不同的。但是我们一般都会尽量去维护其文档的数据格式的一致性。不然维护起来问题太大。
所以这里文档是按照既定的数据格式来使用。
而data-mongodb最人性化的一点是很接近于jpa。所以我们如果有jpa的使用经验,那么使用起来是非常方便上手的。
data-mongodb基于注解的使用
data-mongodb中的注解第一步:把文档定义为实体类,并做好映射。
因为我们获取到的数据一定在java中有个实体对象来接收(哪怕是list)。所以这步映射和jpa的映射其实差不多概念。暂时我不知道能不能自动生成,反正我这边是手写的。
其实重点就是几个注解。
@Document(collection="newyork")
实体类中添加这个注解就可以把mongodb中的文档和类建立映射了。类似于jpa的@Entity注解。 在spring官网上也是这么说的:
@Document之于mongodb等同于@Entity之于jpa
然后如果实体类中的字段和mongodb的文档中的key名称不符合,可以如此标注,jpa和mybatis-plus都有类似的功能,其实这个比较容易理解,下面是官网的使用demo:
@Field注解的使用
@id就是标注此字段是文档的id,没啥好说的。
第二步:MongoTemplate和Repository
这两个都是可以操作mongodb的一种方式。
只不过template就是一个模板方法,每次传参要确定操作哪个文档等,我个人感觉有点类似于mp的条件构造器(单纯的用法上)。而Repository是一个族群。和jpa的Repository大同小异、其中也有很多封装了基础操作的接口,比如CrudRepository或PagingAndSortingRepository。其中就封装了基本的crud方法和分页排序啥的。只不过这种用法的前期准备比较复杂,要每一个表(文档)做一个映射。
这个用法也是类似于jpa的,就是每一个实体写一个接口,然后继承Repository。其中泛型传自己的。没啥好说的。感觉这种用法是用起来最熟练的。毕竟我们现在的mp和jpa都是类似的写法。
同样我暂时不知道有没有代码生成器可以自动生成类,但是手动写也能接受。而且这个也支持属性名映射,如下截图:
根据LastName查询
这就不细说了,感兴趣的自己去
然后MongodbTemplate的用法有点类似redisTemplate了,不过这个比redisTemplate要复杂一点,毕竟这个要涉及到文档类型,属性啥的。关于这块我们可以去spring官网去看看,如下位置说的很详细:
mongoTemplate介绍
当然了我们项目中使用比较简单,直接注入了data.mongodb.core中的mongoTemplate。点进去我们可以看下其中的方法,这个方法两千多行,所以我就不一一说了,总而言之常用的instert,save,remove,find都有。
find方法
需要注意的是这个查询的参数。Query类型的,所以我们在使用的时候要先创建这样一个条件构造器。我们上面看mongoTemplate的时候应该也看到了Query,Criteria已经Update等工具类。其实简单来说,
三个类中,query负责构建查询条件。而Criteria是具体的条件的添加。Update负责修改的条件。(用sql来比喻,query 类似于where,criteria类似于name = 'lisijia' and age>6 or XXXX这样的具体的条件。update类似于set age = 11这部分)、
我们在使用的时候其实也比较简单,毕竟框架做出来是让人用的,下面是个简单的使用:
Query query = new Query();
query.addCriteria(Criteria.where("positon_id").is(positionId));
List<UserVO>userList = mongoTemplate.find(query, UserVO.class,
TableConstant.CAR_CLOCK_IN_RECORD);
System.out.println(userList);
很明显,上面的代码是查询位置id是给定参数的用户列表。这个cirteria是支持很多运算符的,具体可以去官网看,我简单截了个图:
Criteria类的方法
还有个分页排序,也已经有现成的轮子了,直接附上截图:
mongoTemplate的分页
剩下其实没啥东西了,毕竟我这两天也只是简单的看了下基本的使用,以后有什么问题会追加的。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利,生活健健康康!
网友评论