Appearance
前置知识 MongoDB 使用教程
Spring Data MongoDB
简介
和Spring Data Elasticsearch类似,Spring Data Mongodb是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。
常用注解
| 名称 | 作用 |
|---|---|
| @Document | 标示映射到MongoDB文档上的领域对象 |
| @Id | 标示某个字段为ID域 |
| @Indexed | 标示某个字段为MongoDB的索引字段 |
Spring Data方式的数据操作
- 继承MongoRepository接口可以获得常用的数据操作方法;

- 可以使用衍生查询,在接口中直接指定查询方法名称,无需进行实现即可查询,下面以根据会员ID按时间倒序获取浏览记录为例;
java
/**
* @auther macrozheng
* @description 会员商品浏览历史Repository
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory,String> {
/**
* 根据会员id按时间倒序获取浏览记录
* @param memberId 会员id
*/
List<MemberReadHistory> findByMemberIdOrderByCreateTimeDesc(Long memberId);
}- 在编写衍生查询方法时,IDEA会提示对应字段,更多关键字可以参考衍生查询关键字对照表;

- 使用@Query注解可以用MongoDB的JSON查询语句进行查询。
java
/**
* @auther macrozheng
* @description 会员商品浏览历史Repository
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory,String> {
@Query("{ 'memberId' : ?0 }")
List<MemberReadHistory> findByMemberId(Long memberId);
}整合MongoDB实现文档操作
整合依赖及配置
- 在pom.xml中添加MongoDB相关依赖;
xml
<!---MongoDB相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>- 修改application.yml文件,在spring节点下添加MongoDB相关配置。
yaml
spring:
data:
mongodb:
host: localhost # MongoDB的连接地址
port: 27017 # MongoDB的连接端口号
database: mall-port # MongoDB的连接的数据库实现文档操作
- 添加会员浏览记录文档对象MemberReadHistory,文档对象的ID域添加@Id注解,需要检索的字段添加@Indexed注解;
java
/**
* @auther macrozheng
* @description 用户商品浏览历史记录
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
@Data
@EqualsAndHashCode
@Document
public class MemberReadHistory {
@Id
private String id;
@Indexed
private Long memberId;
private String memberNickname;
private String memberIcon;
@Indexed
private Long productId;
private String productName;
private String productPic;
private String productSubTitle;
private String productPrice;
private Date createTime;
}- 添加MemberReadHistoryRepository接口用于操作MongoDB,继承MongoRepository接口,这样就拥有了一些基本的数据操作方法,同时定义了一个衍生查询方法;
java
/**
* @auther macrozheng
* @description 会员商品浏览历史Repository
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory,String> {
/**
* 根据会员id按时间倒序获取浏览记录
* @param memberId 会员id
*/
List<MemberReadHistory> findByMemberIdOrderByCreateTimeDesc(Long memberId);
}- 添加MemberReadHistoryService接口;
java
/**
* @auther macrozheng
* @description 会员浏览记录管理Service
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
public interface MemberReadHistoryService {
/**
* 生成浏览记录
*/
int create(MemberReadHistory memberReadHistory);
/**
* 批量删除浏览记录
*/
int delete(List<String> ids);
/**
* 获取用户浏览历史记录
*/
List<MemberReadHistory> list(Long memberId);
}- 添加MemberReadHistoryService接口实现类MemberReadHistoryServiceImpl;
java
/**
* @auther macrozheng
* @description 会员浏览记录管理Service实现类
* @date 2018/8/3
* @github https://github.com/macrozheng
*/
@Service
public class MemberReadHistoryServiceImpl implements MemberReadHistoryService {
@Autowired
private MemberReadHistoryRepository memberReadHistoryRepository;
@Override
public int create(MemberReadHistory memberReadHistory) {
memberReadHistory.setId(null);
memberReadHistory.setCreateTime(new Date());
memberReadHistoryRepository.save(memberReadHistory);
return 1;
}
@Override
public int delete(List<String> ids) {
List<MemberReadHistory> deleteList = new ArrayList<>();
for(String id:ids){
MemberReadHistory memberReadHistory = new MemberReadHistory();
memberReadHistory.setId(id);
deleteList.add(memberReadHistory);
}
memberReadHistoryRepository.deleteAll(deleteList);
return ids.size();
}
@Override
public List<MemberReadHistory> list(Long memberId) {
return memberReadHistoryRepository.findByMemberIdOrderByCreateTimeDesc(memberId);
}
}- 添加MemberReadHistoryController定义接口;
java
/**
* 会员商品浏览记录管理Controller
* Created by macro on 2018/8/3.
*/
@Controller
@Api(tags = "MemberReadHistoryController", description = "会员商品浏览记录管理")
@RequestMapping("/member/readHistory")
public class MemberReadHistoryController {
@Autowired
private MemberReadHistoryService memberReadHistoryService;
@ApiOperation("创建浏览记录")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public CommonResult create(@RequestBody MemberReadHistory memberReadHistory) {
int count = memberReadHistoryService.create(memberReadHistory);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("删除浏览记录")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public CommonResult delete(@RequestParam("ids") List<String> ids) {
int count = memberReadHistoryService.delete(ids);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("展示浏览记录")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<MemberReadHistory>> list(Long memberId) {
List<MemberReadHistory> memberReadHistoryList = memberReadHistoryService.list(memberId);
return CommonResult.success(memberReadHistoryList);
}
}文档操作功能演示
运行项目,访问Swagger API文档,访问地址:http://localhost:8080/swagger-ui/
通过/member/readHistory/create接口将商品浏览记录添加到MongoDB;
通过/member/readHistory/list接口查询MongoDB中的商品浏览记录。
衍生查询关键字对照表
| Keyword | Sample | Logical result |
|---|---|---|
| After | findByBirthdateAfter(Date date) | {"birthdate" : {"$gt" : date}} |
| GreaterThan | findByAgeGreaterThan(int age) | {"age" : {"$gt" : age}} |
| GreaterThanEqual | findByAgeGreaterThanEqual(int age) | {"age" : {"$gte" : age}} |
| Before | findByBirthdateBefore(Date date) | {"birthdate" : {"$lt" : date}} |
| LessThan | findByAgeLessThan(int age) | {"age" : {"$lt" : age}} |
| LessThanEqual | findByAgeLessThanEqual(int age) | {"age" : {"$lte" : age}} |
| Between | findByAgeBetween(int from, int to) | {"age" : {"$gt" : from, "$lt" : to}} |
| In | findByAgeIn(Collection ages) | {"age" : {"$in" : [ages...]}} |
| NotIn | findByAgeNotIn(Collection ages) | {"age" : {"$nin" : [ages...]}} |
| IsNotNull, NotNull | findByFirstnameNotNull() | {"firstname" : {"$ne" : null}} |
| IsNull, Null | findByFirstnameNull() | {"firstname" : null} |
| Like, StartingWith, EndingWith | findByFirstnameLike(String name) | {"firstname" : name} (name as regex) |
| NotLike, IsNotLike | findByFirstnameNotLike(String name) | {"firstname" : { "$not" : name }} (name as regex) |
| Containing on String | findByFirstnameContaining(String name) | {"firstname" : name} (name as regex) |
| NotContaining on String | findByFirstnameNotContaining(String name) | {"firstname" : { "$not" : name}} (name as regex) |
| Containing on Collection | findByAddressesContaining(Address address) | {"addresses" : { "$in" : address}} |
| NotContaining on Collection | findByAddressesNotContaining(Address address) | {"addresses" : { "$not" : { "$in" : address}}} |
| Regex | findByFirstnameRegex(String firstname) | {"firstname" : {"$regex" : firstname }} |
| (No keyword) | findByFirstname(String name) | {"firstname" : name} |
| Not | findByFirstnameNot(String name) | {"firstname" : {"$ne" : name}} |
| Near | findByLocationNear(Point point) | {"location" : {"$near" : [x,y]}} |
| Within | findByLocationWithin(Circle circle) | {"location" : {"$geoWithin" : {"$center" : [ [x, y], distance]}}} |
| IsTrue, True | findByActiveIsTrue() | {"active" : true} |
| IsFalse, False | findByActiveIsFalse() | {"active" : false} |
| Exists | findByLocationExists(boolean exists) | {"location" : {"$exists" : exists }} |
| IgnoreCase | findByUsernameIgnoreCase(String username) | {"username" : {"$regex" : "^username$", "$options" : "i" }} |