mongodb dirver for java【聚合】

41 篇文章 1 订阅

环境

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字段和计算字段firstCategoryfirstCategory这个字段的值就是每个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原生知识的掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值