Skip to content

Spring Data MongoDB

前置知识 MongoDB 使用教程

Spring Data MongoDB

简介

和Spring Data Elasticsearch类似,Spring Data Mongodb是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。

常用注解

名称作用
@Document标示映射到MongoDB文档上的领域对象
@Id标示某个字段为ID域
@Indexed标示某个字段为MongoDB的索引字段

Spring Data方式的数据操作

  • 继承MongoRepository接口可以获得常用的数据操作方法;

image.png

  • 可以使用衍生查询,在接口中直接指定查询方法名称,无需进行实现即可查询,下面以根据会员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会提示对应字段,更多关键字可以参考衍生查询关键字对照表;

image.png

  • 使用@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中的商品浏览记录。

衍生查询关键字对照表

KeywordSampleLogical result
AfterfindByBirthdateAfter(Date date){"birthdate" : {"$gt" : date}}
GreaterThanfindByAgeGreaterThan(int age){"age" : {"$gt" : age}}
GreaterThanEqualfindByAgeGreaterThanEqual(int age){"age" : {"$gte" : age}}
BeforefindByBirthdateBefore(Date date){"birthdate" : {"$lt" : date}}
LessThanfindByAgeLessThan(int age){"age" : {"$lt" : age}}
LessThanEqualfindByAgeLessThanEqual(int age){"age" : {"$lte" : age}}
BetweenfindByAgeBetween(int from, int to){"age" : {"$gt" : from, "$lt" : to}}
InfindByAgeIn(Collection ages){"age" : {"$in" : [ages...]}}
NotInfindByAgeNotIn(Collection ages){"age" : {"$nin" : [ages...]}}
IsNotNull, NotNullfindByFirstnameNotNull(){"firstname" : {"$ne" : null}}
IsNull, NullfindByFirstnameNull(){"firstname" : null}
Like, StartingWith, EndingWithfindByFirstnameLike(String name){"firstname" : name} (name as regex)
NotLike, IsNotLikefindByFirstnameNotLike(String name){"firstname" : { "$not" : name }} (name as regex)
Containing on StringfindByFirstnameContaining(String name){"firstname" : name} (name as regex)
NotContaining on StringfindByFirstnameNotContaining(String name){"firstname" : { "$not" : name}} (name as regex)
Containing on CollectionfindByAddressesContaining(Address address){"addresses" : { "$in" : address}}
NotContaining on CollectionfindByAddressesNotContaining(Address address){"addresses" : { "$not" : { "$in" : address}}}
RegexfindByFirstnameRegex(String firstname){"firstname" : {"$regex" : firstname }}
(No keyword)findByFirstname(String name){"firstname" : name}
NotfindByFirstnameNot(String name){"firstname" : {"$ne" : name}}
NearfindByLocationNear(Point point){"location" : {"$near" : [x,y]}}
WithinfindByLocationWithin(Circle circle){"location" : {"$geoWithin" : {"$center" : [ [x, y], distance]}}}
IsTrue, TruefindByActiveIsTrue(){"active" : true}
IsFalse, FalsefindByActiveIsFalse(){"active" : false}
ExistsfindByLocationExists(boolean exists){"location" : {"$exists" : exists }}
IgnoreCasefindByUsernameIgnoreCase(String username){"username" : {"$regex" : "^username$", "$options" : "i" }}