zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14964636.html
Copyright © 2011-2022 走看看