环境
MongoDB:3.+
mongodb dirver for Java: 3.+
@author:喻涛
概要
本篇是翻译官网:
https://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/aggregation/
讲解的是用java代码对MongoDB进行聚合操作。
Aggregation Framework
聚合管道是数据聚合的框架,其实仿造数据处理管道的概念。
先决条件
在test
数据库中要有一个restaurants
集合。
(你可以使用你本地的测试环境中的集合,来做下面的测试)
你可能需要import
的声明:
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Accumulators;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Filters;
下面的这段代码是在教程示例中将会把查询到的结果打印出来。
Block<Document> printBlock = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
连接数据库
这里我贴出我自己的代码:
//连接数据库 start
MongoCredential credential =
//根据自己的情况修改
MongoCredential.createCredential("gg_openapi",
"gg_openapi", "gg..openapi#!".toCharArray());
//根据自己的情况修改
serverAddress = new ServerAddress("106.75.51.20", 35520);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
@SuppressWarnings("resource")
MongoClient mongoClient = new MongoClient(addrs, credentials);
MongoDatabase database = mongoClient.getDatabase("gg_openapi");
System.out.println("Connect to database successfully");
//连接数据库 end
执行聚合
要执行聚合,你需要把聚合各个阶段的列表传递给MongoCollection.aggregate()
方法。
java提供了Aggregates
助手类,该类包含了聚合阶段的构建器。
说明:这个翻译的聚合阶段,其实就是聚合的各个管道,大概有哪些呢?我列举一些:
$project
$match
$group
$sort
$skip
$limit
$count
下面代码中,聚合的管道有:
①使用$match
来进行过滤文档,下面的例子中过滤数组字段categories
包含Bakery
。示例中使用Aggregates.match
来构建$match
管道。
②使用$group
,通过按照字段stars
来进行分组,同时,计算每组的数量。下面的示例使用的是Aggregates.group
来构建$group
管道,Accumulators.sum
用来构建累加器表达式
,为了在$group
管道中使用累加器表达式,java驱动程序提供了Accumulators
助手类。
collection.aggregate(
Arrays.asList(
Aggregates.match(Filters.eq("categories", "Bakery")),
Aggregates.group("$stars", Accumulators.sum("count", 1))
)
).forEach(printBlock);
使用聚合表达式
对于$group 累加器表达式
,java驱动程序提供了Accumulators
助手类。对于其他聚合表达式,可以利用Document
对象手动来构建。
下面示例中,聚合管道使用$project
来只返回name
字段和计算字段firstCategory
,firstCategory
这个字段的值就是每个categories
数组的第一个元素的值。这个例子使用Aggregates.project
和各种Projections
方法来构建$project
阶段。
collection.aggregate(
Arrays.asList(
Aggregates.project(
Projections.fields(
Projections.excludeId(),
Projections.include("name"),
Projections.computed(
"firstCategory",
new Document("$arrayElemAt", Arrays.asList("$categories", 0))
)
)
)
)
).forEach(printBlock);
总结
本篇教程重点介绍3.+
驱动程序中提供的助手类
。
个人还是不建议使用。不利于对MongoDB
原生知识的掌握。