springboot结合 mongodb 分页查询

mogngo分页简单快捷

    @RequestMapping(value = "/page", method = RequestMethod.GET)
    public PageMessage selectSendRecord(HttpServletRequest request,long userId, String token, String moblie, long beginDate, long endDate, Integer status,
                                        @RequestParam(name = "page") Integer pageIndex, @RequestParam(name = "limit") Integer pageSize) {
        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.and("user_id").is(userId);
        if (beginDate > 0 && endDate > 0) {
            query.addCriteria(Criteria.where("send_time").gte(beginDate).lte(endDate));
        }
        if (StringUtils.isNotBlank(moblie)) {
            //criteria.and("phone").is(moblie);
            criteria.and("phone").regex(moblie + ".*");
        }
        if (StringUtils.isNotBlank(status)) {
            criteria.and("status").is(status);
        }
        query.addCriteria(criteria);
        pageIndex = pageIndex - 1;
        if (pageIndex < 0) {
            pageIndex = 0;
        }
        int count = (int)mongoService.getMongoTemplate().count(query, User.class);
        Pageable pageable = PageRequest.of(pageIndex, pageSize);
        query.with(pageable);
        query.with(Sort.by(Sort.Order.desc("user_id")));
        List<User> items = mongoService.getMongoTemplate().find(query, User.class);
        return new PageMessage (ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), count, items);
}

数据量大的话排序会出现下面的异常

com.mongodb.MongoQueryException: Query failed with error code 96 and error message ‘Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.’ on server

主要原因是mongodb的sort操作是把数据拿到内存中再进行排序的,为了节约内存,默认给sort操作限制了最大内存为32Mb,当数据量越来越大直到超过32Mb的时候就自然抛出异常了。把索引建上就可以解决问题。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值