mongo支持表达式条件查询

前言

通过相关表达式,如 concat, substr, toLower, toUpper 等,对mongo进行操作;
并且可以根据操作结果进行条件判断。

相关聚合表达式

10.11.2. Supported Aggregation Operations

代码编写

此处以 substr为例。

1、输入类 Input

@Document(collection = "test")
public class Input {

        @Id
    	@GeneratedValue
    	@Field("_id")
        private String id;


        @Field("title")
        private String title = "";

        @Field("created_time")
        private String createdTime = "";

        @Field("updated_time")
        private String updatedTime = "";


        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getCreatedTime() {
            return createdTime;
        }

        public void setCreatedTime(String createdTime) {
            this.createdTime = createdTime;
        }

        public String getUpdatedTime() {
            return updatedTime;
        }

        public void setUpdatedTime(String updatedTime) {
            this.updatedTime = updatedTime;
        }

    }

2、输出类 Output

public class Output {
        private String id;

        private String title = "";

        private String createdTime = "";

        private String updatedTime = "";


        private String createdDate;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getCreatedTime() {
            return createdTime;
        }

        public void setCreatedTime(String createdTime) {
            this.createdTime = createdTime;
        }

        public String getUpdatedTime() {
            return updatedTime;
        }

        public void setUpdatedTime(String updatedTime) {
            this.updatedTime = updatedTime;
        }

        public String getCreatedDate() {
            return createdDate;
        }

        public void setCreatedDate(String createdDate) {
            this.createdDate = createdDate;
        }
    }

3、操作方法

    @Autowired
    MongoTemplate mongoTemplate;
    
    @Test
    public void testAggregation3() {
        Pageable pageable = PageRequest.of(0, 10, Sort.Direction.ASC, "createdTime");

        List operations = new ArrayList();

        // 查询条件,样例
        //        Pattern pattern = Pattern.compile("^.*$", Pattern.CASE_INSENSITIVE);
        //        Criteria criteria = Criteria.where("title").regex(pattern);
        //        operations.add(Aggregation.match(criteria));

        //查询项 自定义项
        operations.add(Aggregation.project("title","createdTime", "id", "updatedTime")
                .and("createdTime").as("createdTime")
                .and("updatedTime").as("updatedTime")
                .andExpression("substr(createdTime,0,10)").as("createdDate"));

        // 根据生成的字段进行条件判断
        Criteria criteria = Criteria.where("createdDate").gte("2019-05-10");
        operations.add(Aggregation.match(criteria));

        // 分页排序相关
        operations.add(Aggregation.limit(pageable.getPageSize()));
        operations.add(Aggregation.sort(pageable.getSort()));


        Aggregation aggregation = Aggregation.newAggregation(operations);

        
        AggregationResults results = mongoTemplate.aggregate(aggregation, Input.class, Output.class);

        //查询结果集
        System.out.println("========" + results.getMappedResults());

    }

命令

相当于执行命令

db.getCollection('test').aggregate({ "$project" :
 { "title" : 1, "createdTime" : "$created_time", "id" : "$_id", "updatedTime" : "$updated_time", "createdDate" : { "$substr" : ["$created_time", 0, 10] } } },
 { "$match" : { "createdDate" : { "$gte" : "2019-05-10" } } },
 { "$limit" : 10  }, { "$sort" : { "createdTime" : 1 } })

注:spring 打印的 语句如下:

# 需要替换{ "$numberLong" : "10" } 为数字 10 
{ "aggregate" : "test", "pipeline" : [{ "$project" : { "title" : 1, "createdTime" : "$created_time", "id" : "$_id", "updatedTime" : "$updated_time", "createdDate" : { "$substr" : ["$created_time", 0, 10] } } },
 { "$match" : { "createdDate" : { "$gte" : "2019-05-10" } } }, {
  "$limit" : { "$numberLong" : "10" } }, { "$sort" : { "createdTime" : 1 } }], 
  "cursor" : { "batchSize" : 2147483647 } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值