Spring Data Mongodb提供一套快捷操作 mongodb的方法,创建Dao,继承MongoRepository,并指定实体类型和主键类型。
public interface CmsPageRepository extends MongoRepository<CmsPage,String> { }
增加文档
User user = userRepository.insert(user); // 插入一条数据
User user = userRepository.insert(List<User> users)); // 插入多条数据
User user = userRepository.save(user); // 保存一条数据
User user = userRepository.insert(List<User> users)); // 保存多条数据
insert 和 save 的区别:
save()方法更新一个已存在的文件或者插入一条数据,取决于一个文件中的一个字段。如果一个文件中不包含一个id,然后save()方法直接调用insert()方法和生成一个id;如果包含id就直接更新。
1.insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.Duplicate KeyException 异常提示主键重复,不保存当前数据。
2.save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
删除文档
userRepository.deleteById("5b17a2c511fe5e0c409e5eb3"); // 根据id删除
userRepository.delete(User user); // 根据对象信息删除
userRepository.delete(List<User> users); // 批量删除某条数据
userRepository.deleteAll(); // 清空表中所有的数据
更新文档
全部更新(若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。)
CmsPage cmsPage = new CmsPage();
cmsPageRepository.save(cmsPage);
更新部分字段
Map<String, Object> params = new HashMap<>();
params.put("isDelete", "true");
cmsPageRepository.update(id, params);
删除文档
cmsPageRepository.deleteById("5b17a2c511fe5e0c409e5eb3");
查询
判断数据是否存在
boolean result = userRepository.exists(id); // 判断数据是否存在
Example example = Example.of(user); // 判断某特定数据是否存在
boolean result = userRepository.exists(example);
统计总数
long result = userRepository.count(); // 统计表中的数据条数
Example<User> example = Example.of(user); // 有条件的统计表中的数据条数
long result = userRepository.count();
查询一条数据
User user = userRepository.findOne(id); // 通过id查询一条数据
User user = new User(); // 多条件查询一条数据
user.setUserName(userName);
Example<User> example = Example.of(user);
User user = userRepository.findOne(example);
查询列表
List<User> list = userRepository.findAll(); // 获取表中所有的数据
Sort sort = new Sort(Sort.Direction.ASC,"id"); // 获取表中所有的数据,按照某特定字段排序
List<User> list = userRepository.findAll(sort); // 第二个参数是变长参数,可以传多个值
Pageable pageable = new PageRequest(page,size); // 获取表中所有的数据,分页查询
List<User> list = userRepository.findAll(pageable);
List<User> list = userRepository.findAll(List<String> ids); // 根据id的集合查询
条件查询
User user = new User();
user.setUserName(name);
Example example = Example.of(user);
List<User> list = userRepository.findAll(example);
分页查询
int page = 0;//从0开始
int size = 10;//每页记录数
PageRequest page = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(page);
条件分页查询
Example example = Example.of(user);
PageRequest page = new PageRequest(page,size);
List<User> list = userRepository.findAll(example ,page);
排序查询
Order order = new Order(Direction.ASC,"age");
Sort sort = new Sort(order);
List<User> list = userRepository.findAll(sort);
自定义查询
同Spring Data JPA一样Spring Data mongodb也提供自定义方法的规则,如下: 按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等规则定义方法,实现查询操作。
public interface CmsPageRepository extends MongoRepository<CmsPage,String> {
// 根据页面名称查询
CmsPage findByPageName(String pageName);
// 根据页面名称模糊查询
CmsPage findByPageNameLike(String pageName);
// 根据页面名称和类型查询
CmsPage findByPageNameAndPageType(String pageName,String pageType);
// in查询
List<CmsPage> findByPageNameIn(List<String> names);
// 根据站点和页面类型查询记录数
int countBySiteIdAndPageType(String siteId,String pageType);
// 根据站点和页面类型分页查询
Page<CmsPage> findBySiteIdAndPageType(String siteId,String pageType, Pageable pageable);
// 排序查询
List<BookInfo> findAllByOrderByCreateTimneDesc(Pageable pageable);
}
根据一个或者多个属性查询单个结果
User user = new User();
user.setUserName(name);
ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
Example<User> example = Example.of(user, matcher);
List<User> list = userRepository.findOne(example);
注意事项:
如果实体类中包含有基本数据类型的属性,那么在使用repository.find(Example)时,需要把这些属性忽略掉,因为基本数据类型在新建对象时会有默认值,这时如果你按照别的属性查找数据时,这些属性也会附带到条件里。比如上文代码中有一个根据用户名查找用户的方法,此时你期望的是在查询过程中只有用户名起作用,那么这时候就要加上下面的代码。如果不加,则条件中会多出age=0&createTime=0,查出的结果有误。
ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");