前言
通过相关表达式,如 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 } }