• 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!!!
  • 相关阅读:
    搭上末班车去了京东,终于可以做东哥兄弟...
    面试官问我会不会Elasticsearch,我语塞了...
    Elasticsearch到底哪点好?
    资本寒冬,应届生被裁,亲身经历从被裁到上岸,我们该如何自渡?如何保持核心竞争力?
    面试官求你了,别再问我TCP的三次握手和四次挥手
    如何保证网络传输的可靠性?
    龙叔拿了20几个offer,原因竟有些泪目...
    面试百度的机器学习算法,也不过如此
    《数据结构与算法》—— O(3N)=O(N) ?
    我以为我学懂了数据结构,看到这张导图,我才发现我错了
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14964636.html
Copyright © 2020-2023  润新知