7.2MongoDB之聚合

7.2MongoDB之聚合

  • MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

  • 类似 SQL 语句中的 count(*)

aggregate()方法

语法:

db.getCollection().aggregate(AGGREGATE_OPERATION)

使用Java往MongoDB集合中加入数据:

package mongodbtest;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;

/**
* 1、利用Java连接MongoDB
* 2、连接数据库practice
* 3、创建集合:practiceindex
* 4、向集合中插入10w条记录
* 5、创建索引
* 6、利用索引查询
* @since JDK 1.8
* @date 2021/7/1
* @author Lucifer
*/
public class MongoDBTestNo1 {

   /*定义连接需要用到的属性*/
   private static String MONGO_HOST = "localhost";
   private static Integer MONGO_PORT = 27017;
   private static final String MONGO_DB_NAME = "practice";
   private static final String GATHER_NAME = "practiceaggregate";

   public static String getMongoHost() {
       return MONGO_HOST;
  }

   public static Integer getMongoPort() {
       return MONGO_PORT;
  }

   public static void setMongoHost(String mongoHost) {
       MONGO_HOST = mongoHost;
  }

   public static void setMongoPort(Integer mongoPort) {
       MONGO_PORT = mongoPort;
  }

   /**
    * 访问MongoDB服务,连接到指定的数据库
    * @param mongo_host
    * @param mongo_port
    * @return
    */
   public static MongoDatabase connection(String mongo_host, Integer mongo_port){

       //使用MongoClient类创建Mongo连接服务
       MongoClient mongoClient = new MongoClient(mongo_host,mongo_port);

       //使用服务引用连接到数据库
       MongoDatabase mongoDatabase = mongoClient.getDatabase(MONGO_DB_NAME);
       System.out.println("Connect to database successfully!!!");

       //返回Mongodatabase对象
       return mongoDatabase;

  }

   /**
    * 创建集合
    * @return
    */
   public static MongoDatabase createCollection(String gather_name){

       //访问到指定的域名和端口
       MongoDatabase mongoDatabase = connection(MONGO_HOST, MONGO_PORT); //创建一个connection方法的引用--->为了使用connection方法的返回对象

       //使用mongoDatabase类创建集合
       mongoDatabase.createCollection(gather_name);
       System.out.println("Create collection successfully!!!");

       //结束方法
       return mongoDatabase;

  }

   /**
    * 选择集合获取集合信息
    * @return
    */
   public static MongoCollection<Document> getCollection(){

       //创建Mongodatabase引用
       MongoDatabase mongoDatabase = createCollection(GATHER_NAME); //创建一个getCollection方法的引用--->为了使用getCollection方法的返回对象


       //使用返回值类型获取集合名称
       MongoCollection<Document> collection = mongoDatabase.getCollection(GATHER_NAME);
       System.out.println("Choose collection successfully!!!");

       //返回集合对象
       return collection;

  }

   /**
    * 插入内容方法
    */
   public static void insertMany(){

       //创建文档List
       List<Document> documents = new ArrayList<Document>();

       //新建文档对象,创建编辑文档内容
       Document document1 = new Document("title","MongoDB Overview").
               append("description","MongoDB is no sql database").
               append("by_user","JunkingBoy").
               append("tags","['mongodb', 'database', 'NoSQL']").
               append("likes","100");
       Document document2 = new Document("title","NoSQL Overview").
               append("description","No sql database is very fast").
               append("by_user","JunkingBoy").
               append("tags","['mongodb', 'database', 'NoSQL']").
               append("likes","10");
       Document document3 = new Document("title","Neo4j Overview").
               append("description","Neo4j is no sql database").
               append("by_user","Neo4j").
               append("tags","['neo4j', 'database', 'NoSQL']").
               append("likes","750");

       //将文档添加进列表中
       documents.add(document1);
       documents.add(document2);
       documents.add(document3);

       //使用MongoClient类的insertMany方法插入列表
       getCollection().insertMany(documents);
       System.out.println("文档插入成功!!!");

  }
}

计算每个作者所写的文章数,使用aggregate()--->类似sql语句:

select by_user, count(*) from mycol group by by_user
# 通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和

 

db.getCollection("practiceaggregate").aggregate(
[
{
$group:{
_id:"$by_user",
num_tutorial:{
$sum:1
}
}
}
]
)

聚合函数的表达式:

表达式描述实例
$sum 计算总和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{$group : {_id : "$by_user", field : {$push: "$url"}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{$group : {_id : "$by_user",field : {$addToSet : "$url"}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : "$by_user", first_field : {$first : "$url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{$group : {_id : "$by_user", first_field : {$last : "$url"}}}])

管道的概念

管道的作用:

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB中的管道符:

  • MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。

  • 管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

聚合框架中几个常用的操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

  • $limit:用来限制MongoDB聚合管道返回的文档数。

  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

  • $group:将集合中的文档分组,可用于统计结果。

  • $sort:将输入文档排序后输出。

  • $geoNear:输出接近某一地理位置的有序文档。

实例:

  1. $project实例

当前MongoDB存在的域:

db.getCollection("practiceaggregate").aggregate(
{
$project:{
title:1,
description:1,
by_user:1,
likes:1
}
}
)

执行语句后的效果图:

_id是被默认包含的,要除去要插入:id:0

  1. $match实例(获取分数指定条件内容,然后将符合条件的记录送到下一阶段管道操作符进行处理。)

实例:

db.getCollection("practiceaggregate").aggregate(
[
{
$match:{
likes:{
$gt:100
}
}
},{
$group:{
_id:null
}
}
]
)

 

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14964636.html