mongoDb利用mongoTemplate实现分页、范围、排序查询样例

实体类:

package cn.yiducloud.project.task.model;

import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.MongoId;

import java.io.Serializable;
import java.util.Date;

@Data
@Document(collection = "task")
public class Task implements Serializable {
	//MongoDb的主键类型设置为ObjectId类型,并且加@MongoId注解,不然直接通过主键查询的时候会返回null
    @MongoId
    @Field("_id")
    private ObjectId id;
    @Field("type")
    private String type;
    @Field("status")
    private String status;
    @Field("param")
    private String param;
    @Field("url")
    private String url;
    @Field("create_time")
    private Date createTime;
    @Field("update_time")
    private Date updateTime;

}

查询逻辑见代码里,有相关注释:

package cn.yiducloud.project.task.service.impl;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.yiducloud.project.task.dataroute.TaskDao;
import cn.yiducloud.project.task.dto.TaskQueryDto;
import cn.yiducloud.project.task.model.Task;
import cn.yiducloud.project.task.service.TaskService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;


@Service
public class TaskServiceImpl implements TaskService {
    @Resource
    private TaskDao taskDao;

    @Override
    public Page<Task> pageList(TaskQueryDto taskQueryDto) {
        //获取MongoTemplate,这里有很多方法,可以自选
        MongoTemplate template = taskDao.getTemplate();
        //创建查询对象
        Query query = new Query();
        //获取页码参数
        Integer pageNum = taskQueryDto.getPageNum();
        Integer pageSize = taskQueryDto.getPageSize();
        if (StrUtil.isNotBlank(taskQueryDto.getType())) {
            query.addCriteria(Criteria.where("type").is(taskQueryDto.getType()));
        }
        if (StrUtil.isNotBlank(taskQueryDto.getStatus())) {
            query.addCriteria(Criteria.where("status").is(taskQueryDto.getStatus()));
        }
        //拆解起止时间的数组
        if (StrUtil.isNotBlank(taskQueryDto.getStartDate())||StrUtil.isNotBlank(taskQueryDto.getEndDate())) {
            //要查询同一个字段多个约束需要用andOperator:不然会报异常:you can't add a second 'createtime' expression specified as 'createtime
            //先创建create_time的Criteria,然后灵活加时间起止判定条件
            Criteria create_time = Criteria.where("create_time");
            if (StrUtil.isNotBlank(taskQueryDto.getStartDate())) {
                create_time.gte(DateUtil.parse(taskQueryDto.getStartDate()+" 00:00:00"
                        , DatePattern.NORM_DATETIME_FORMAT));
            }
            if (StrUtil.isNotBlank(taskQueryDto.getEndDate())) {
                create_time.lte(DateUtil.parse(taskQueryDto.getEndDate()+" 23:59:59"
                        , DatePattern.NORM_DATETIME_FORMAT));
            }
            query.addCriteria(create_time);
        }
        //查询总记录数
        int count = (int) template.count(query, Task.class);
        //按照创建时间倒序
        query.with(Sort.by(Sort.Order.desc("create_time")));
        //设置起始数
        query.skip((pageNum - 1) * pageSize);
        //设置查询条数
        query.limit(pageSize);
        //查询当前页数据集合
        List<Task> taskList = template.find(query, Task.class);
        //创建分页实体对象
        Page<Task> page = new Page<>();
        //添加每页的集合、数据总条数、总页数
        page.setRecords(taskList);
        page.setTotal(count);
        page.setSize(count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        return page;
    }
    
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB中的联表查询可以通过MongoTemplate的LookupOperation实现。下面是一个示例代码,展示了如何使用LookupOperation进行分页排序: ```java public Page<Order> getOrders(int page, int size, String sortBy) { Sort sort = Sort.by(sortBy).ascending(); PageRequest pageRequest = PageRequest.of(page, size, sort); LookupOperation lookupOperation = LookupOperation.newLookup() .from("customer") .localField("customerId") .foreignField("_id") .as("customer"); Aggregation aggregation = Aggregation.newAggregation( lookupOperation, Aggregation.sort(sort), Aggregation.skip(pageRequest.getOffset()), Aggregation.limit(pageRequest.getPageSize()) ); AggregationResults<Order> results = mongoTemplate.aggregate( aggregation, "order", Order.class); return new PageImpl<>(results.getMappedResults(), pageRequest, results.getUniqueMappedResults()); } ``` 在上面的代码中,我们首先通过Sort参数指定排序方式,然后使用PageRequest设置分页参数。接着,使用LookupOperation创建联表查询,from指定要联接的表,localField指定本地表中用于引用外键的字段,foreignField指定外部表中要与本地表关联的字段,as指定结果中的别名。 然后使用Aggregation操作构建查询管道,包括联表查询排序分页等操作。最后,通过调用mongoTemplate的aggregate方法执行查询,并将结果封装为Page对象返回。 需要注意的是,查询结果将会是一个包含Order和Customer信息的嵌套对象,我们需要根据实际需求进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值