Spring Data Mongodb操作MongoRepository

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");

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Data MongoDB 中,可以使用 Aggregation Framework 来进行多表分组。下面是一个示例: 假设我们有两个集合,一个是 orders,另一个是 customers,orders 集合中有一个字段 customer_id,表示订单所属的客户。现在我们想要按照客户性别统计他们的订单数量。可以使用以下代码实现: ```java import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Fields; import org.springframework.data.mongodb.core.aggregation.LookupOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class OrderRepositoryImpl implements OrderRepositoryCustom { private final MongoTemplate mongoTemplate; public OrderRepositoryImpl(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } @Override public List<OrderCountByGender> countOrdersByGender() { LookupOperation lookupOperation = LookupOperation.newLookup() .from("customers") .localField("customer_id") .foreignField("_id") .as("customer"); Aggregation aggregation = Aggregation.newAggregation( lookupOperation, Aggregation.project("customer.gender"), Aggregation.group("customer.gender").count().as("count"), Aggregation.project(Fields.fields("count")).and("gender").previousOperation() ); return mongoTemplate.aggregate(aggregation, "orders", OrderCountByGender.class).getMappedResults(); } } ``` 其中 OrderCountByGender 是一个 POJO 类,用于存储按照性别统计的订单数量: ```java public class OrderCountByGender { private String gender; private Long count; // getters and setters } ``` 在上面的代码中,我们使用 LookupOperation 将 orders 集合中的 customer_id 与 customers 集合中的 _id 关联起来。然后,使用 Aggregation 进行分组统计,最后使用 mongoTemplate.aggregate 方法执行聚合操作,并将结果映射到 OrderCountByGender 类型的对象列表中返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mephisto180502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值