Spring中MongoDB Aggregation的使用
简介
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
db.collection.aggregate()方法是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
- 可以多个管道,能方便的进行数据的处理。
- 聚合效率非常高。
- 每个阶段管道限制为100MB的内存。可以设置allowDiskUse为true来在聚合管道节点把数据写入临时文件
- 可以返回一个指针(cursor),数据放在内存中,直接操作
- 输出的结果只能保存在一个文档中,BSON Document大小限制为16M。可以通过返回指针解决
常用操作
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
常见操作举例
订单表
db. orders.insert([
{
"onumber" : "001",
"date" : "2015-07-02",
"cname" : "zcy1",
"items" :[ {
"ino" : "001",
"quantity" :2,
"price" : 4.0
},{
"ino" : "002",
"quantity" : 4,
"price" : 6.0
}
]
},{
"onumber" : "002",
"date" : "2015-07-02",
"cname" : "zcy2",
"items" :[ {
"ino" : "003",
"quantity" :1,
"price" : 4.0
},{
"ino" : "002",
"quantity" :6,
"price" : 6.0
}
]
},{
"onumber" : "003",
"date" : "2015-07-02",
"cname" : "zcy2",
"items" :[ {
"ino" : "004",
"quantity" :3,
"price" : 4.0
},{
"ino" : "005",
"quantity" :1,
"price" : 6.0
}
]
},{
"onumber" : "004",
"date" : "2015-07-02",
"cname" : "zcy2",
"items" :[ {
"ino" : "001",
"quantity" :3,
"price" : 4.0
},{
"ino" : "003",
"quantity" :1,
"price" : 6.0
}
]
}
])
- 查询订单号为001,002,003中的订单详情各个产品卖出多少个,并且过滤掉数量小于1的产品
查询操作示例
@Override
public void getAggregation() {
Set<String> onumberSet=new HashSet<String>();
onumberSet.add("001");
onumberSet.add("002");
onumberSet.add("003");
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("onumber").in(onumberSet)),
Aggregation.unwind("items"),
Aggregation.group("items.ino").sum("items.quantity").as("total"),
Aggregation.match(Criteria.where("total").gt(1))
);
AggregationResults<BasicDBObject> outputType=mongoTemplate.aggregate(agg,"orders", BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = outputType.iterator(); iterator.hasNext();) {
DBObject obj =iterator.next();
System.out.println(obj.toString());
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本