@Override
public List<GroupVo> getAggProject() {
GroupOperation noRepeatGroup = Aggregation.group( "userId","type")
.count().as("num")
.sum("totalProduct").as("count");
Field field = Fields.field("num2", "num");
ProjectionOperation project = Aggregation.project("userId","type")
.andInclude(Fields.from(field));
TypedAggregation<Order> noRepeatAggregation =
Aggregation.newAggregation(Order.class,noRepeatGroup,project);
AggregationResults<GroupVo> noRepeatDataInfoVos = mongoTemplate.aggregate(noRepeatAggregation, GroupVo.class);
List<GroupVo> noRepeatDataList = noRepeatDataInfoVos.getMappedResults();
System.out.println(JSON.toJSONString(noRepeatDataList));
return noRepeatDataList;
project主要作用就是调整文档的字段内容。比如上面内容中获取数据条目数最开始映射到num字段中,但是在下面Field field = Fields.field("num2", "num")
这里将num的映射转为了num2的映射。这个方法在后续使用lookup进行联表查询的时候会非常有用。因为正常进行联表查询的时候被连接表会作为结果集中的子集出现,而使用project可以将子集数据作为文档的同一层级数据展示出来。
关于match
,unwind
,sort
我会在后面的联表查询、分组去重内容里面来介绍
Bucket操作
在使用聚合管道的时候,可以使用Aggregation.bucket
将数据根据某些范围分为多个桶,或者使用Aggregation.bucketAuto
将数据分为指定数量的桶。
- Aggregation.bucket
Aggregation.bucket方法允许使用者设置一个字段,以及一个多段的查询区间。mongodb将根据这个字段的内容以及设置的分组区间生成多个数据桶。我们可以获取每个桶的聚合结果。下面的例子中就是将Order集合中的数据根据type字段的值分为[0,1),[1,2),[2,3),[3,other)四组。
@Override
public List<BucketVo> getAggBucket() {
BucketOperation bucketOperation =
Aggregation.bucket("type")
.withBoundaries(0,1,2,3)
.withDefaultBucket("other")
.andOutput("_id").count().as("count")
.andOutput("totalProduct").sum().as("sum")
.andOutput("totalMoney").avg().as("avg");
TypedAggregation<Order> newAggregation =
Aggregation.newAggregation(Order.class, bucketOperation);
AggregationResults<BucketVo> noRepeatDataInfoVos2 =
mongoTemplate.aggregate(newAggregation, BucketVo.class);
return noRepeatDataInfoVos2.getMappedResults();
- bucket:需要进行分桶依据的字段
- withBoundaries:分桶区间的范围内容,需要注意的是这个范围是包含前一个条件的值不包含后一个条件的值
- withDefaultBucket:所有没被设定范围统计到的数据会被放入到other这个桶中,其中other是这个桶的id
- andOutput:需要输出的内容,一般是针对某个字段的聚合结果
- Aggregation.bucketAuto
bucketAuto是指定的参数和字段,根据对应字段的内容,将数据平均分配为指定数量的桶。比如下面例子中数据根据type字段中的值分成2组
@Override
public List<BucketVo> getAggBucketAuto() {
BucketAutoOperation autoOperation = Aggregation.bucketAuto("type", 2)
.andOutput("_id").count().as("count")
.andOutput("totalProduct").sum().as("sum")
.andOutput("totalMoney").avg().as("avg");
TypedAggregation<Order> newAggregation =
Aggregation.newAggregation(Order.class, autoOperation);
AggregationResults<BucketVo> noRepeatDataInfoVos2 =
mongoTemplate.aggregate(newAggregation, BucketVo.class);
return noRepeatDataInfoVos2.getMappedResults();
个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容,也希望大家看在这个新春佳节只能宅到家中埋头苦逼的码代码的情况下,能给我点一个赞。你的点赞就是我前进的动力。在这里也祝大家新春快乐。
文章前面关于版本依赖版本springboot2.0.8.RELEASEmongodb4.0.14本内容只是为了介绍mongodb最基础的使用以及配置,作为一个知名的数据库,其存在相当多的高级用法,展开来介绍内容会相当多,当然本人并非相关领域的大神,下面内容只不过整理了自己日常使用的一些积累。是对自己经验的积累,也希望能帮助后来的同学关于项目本内容也是我尝...
参数说明:sql(Operators)
where ($match) 、group by ($group)、having($match)、select($project)、order by($sort)、limit($limit)
sum($sum)、count($sum)、join($lookup)
* project:列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段;
* match:搜索条件criteria
* un...
mongoTemplate的GroupOperation分组查询及Criteria条件查询的使用
GroupOperation:
//此处类似于SQL中的groupBy,group("")参数可以是String,也可以是String数组
String[] groupKeys = new String[4];
GroupOperation groupOp = null;
if (1==1)) { // 模拟条件
groupKeys[0] = "";
在Spring Boot中整合MongoDB,可以使用MongoTemplate来执行MongoDB的操作。而$unionWith是MongoDB 4.4版本中新增的集合操作符,可以用于将两个集合合并成一个集合。
在MongoTemplate中使用$unionWith操作符,可以通过以下步骤实现:
1. 定义两个集合的AggregationOperation对象:
AggregationOperation firstCollection = Aggregation.match(Criteria.where("field1").is("value1"));
AggregationOperation secondCollection = Aggregation.match(Criteria.where("field2").is("value2"));
2. 创建$unionWith操作符的AggregationOperation对象:
AggregationOperation unionWith = Aggregation.unionWith("second_collection", firstCollection, secondCollection);
其中,"second_collection"表示要将结果合并到哪个集合中。
3. 执行聚合操作:
AggregationResults<Document> results = mongoTemplate.aggregate(unionWith, "first_collection", Document.class);
List<Document> documents = results.getMappedResults();
其中,"first_collection"表示要执行聚合操作的集合。
完整示例代码如下:
AggregationOperation firstCollection = Aggregation.match(Criteria.where("field1").is("value1"));
AggregationOperation secondCollection = Aggregation.match(Criteria.where("field2").is("value2"));
AggregationOperation unionWith = Aggregation.unionWith("second_collection", firstCollection, secondCollection);
AggregationResults<Document> results = mongoTemplate.aggregate(unionWith, "first_collection", Document.class);
List<Document> documents = results.getMappedResults();
注意,使用$unionWith操作符需要MongoDB 4.4及以上版本支持。