澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2019-05-25 08:25 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

mongo进行Aggregation聚合查询,highcharts做统计报表

笔记:使用mongo聚合查询(一发端根本没接触过mongo,一点一点稳步的查资料完成了专门的职业急需)

mongodb常见操作


  • MongoDB是现阶段noSQL中相当的火的数据库,优劣势都很显然。
      优势:灵活操作,可扩充性强,使用轻便,只要你会js,轻便操作
      劣势:不切合小型项目,放几条数据大小就几10M。数据回滚不便宜
  • 开发银行数据库./mongod --dbpath ~/mongoData/db --port 27017 --logs ~/mongoData/log
      --dbpath 设置数据保存的地方
      --logs 设置数据库操作记录
      --port 数据库运维的端口
  • 补助工具Robomongo
      超好用的mongodb图形化学工业具,能够直观的查阅数据,也得以平昔右键编辑想要修改的数码,这一点实在是相比便宜的,可是当下多少一点也不快的地点就是不援助es6
      注意事项:robomongo私下认可数据每页是50条数据;近来暗许查询的最大数据量是1六M,一般可由此limit分批操作

不久前做了3个总括项目,这几个总结项目大概的需假使总括接口的访问速度。客户端会调用八个接口来记录接口的拜访景况,笔者的供给就须要深入分析这一个多少,然后做出个总括报表。

供给:在订单表中,依照buyerNick分组,总结每种buyer尼克的电话、地址、支付总金额以及总商品数,再次回到结果是CustomerDetail。

基本功操作 (增加和删除改查)

  • 增加产量多少
    db.collectionName.insert()
      插入一条数据的实比方下;然后使用find查询结果,这里能够见到给我们分配了三个 _id 的品质,这是这条数据的地方标记,当然这里也得以在插入的时候扩大本人的 _id 字段

    威尼斯真人网上娱乐 1

    安顿数据

![](https://upload-images.jianshu.io/upload_images/6237946-e1dfd1783f65ed73.png)

插入结果

  • 修改数据

    1. 基础操作
        db.collection.update(
           <query>,
           <update>,
           {
             upsert: <boolean>,
             multi: <boolean>
           }
        )
    

    query: 查询条件
    update: 更新字段,常用几个操作符为$set:更新字段; $unset:删除某字段
    upsert: 设置为true时,借使未有找到查询条件对应的数目时,就插入那条数据,暗许值为false
    multi:设置为true时创新具备查找到的多寡,默许值为false,只更新找到的率先条

    eg: 把刚插入的数目年龄修改为12 db.users.update({name: 'jack'}, {$set: {age: 12}})
    eg: 删除用户jack的年龄字段 db.users.update({name: 'jack'}, {$unset: {age: true}})

    末端的参数都非常的粗略的,试一下就ok啦

  • 剔除数据
    db.user.remove(<query>)query删除满意条件的数额

  • 查询数据
    db.user.find(<query>, <field>)
    query: 筛选标准,常用的操作符$gt,$lt,$ne,$in等等,这几个看一下文书档案就明白怎么写了
    田野(field): 用来选出所需的多寡
    下图为1个简单的查询,查询年龄低于二五的护具,并且只须求多少的中的age字段,重返结果如图

    威尼斯真人网上娱乐 2

    find轻巧实例

`db.users.find().count()`
如需查询满足条件的数据有多少条,在后面加上count进行统计,

*这些都是一些最基本的操作,网上教程很多,推荐基础看一看[菜鸟教程](https://link.jianshu.com?t=http://http://www.runoob.com/mongodb/mongodb-tutorial.html),这篇基础讲的很详细*

急需完成

前期的时候想着天天把那些接口访问情况的音信存款和储蓄到mysql中,然后遵照那么些访问景况做个分析再做报表。然后第三个难题就来了,音信包罗太多字段了,若是本人将各种音信深入分析成mysql表的3个字段,那么这些字段相当短,而且还大概有2个致命缺陷,不轻松扩展。若是将具备字段都存款和储蓄为叁个json,然后存款和储蓄到text字段呢,又无奈创设目录了。所以这种情状,最适合搬出mongo来了。

比较于mysql,mongo的裨益就是扩大性好,灵活。像总括数据那样很轻便供给不明确的多寡确实是个很好的选料。作者此外想想还只怕有个便宜就是永不的数量本身能够很便宜地将数据json化,然后存为文件。然后在急需的时候,也很轻易读取直接放入到mongo中去。例如作者得以将一个月的数额做多个锲而不舍备份之类的操作。

继而是生成总结报表的一对。各样图是很必要的,由于是给当中做计算报表,不须求兼顾各个浏览器。所以作者选用了强压的highCharts。highCharts是一个JS图表库。很有利的就能够生成图表了。亲身体会是其一比flash做图表开荒时间减少多了。你能够从

此伏彼起呢,由于前边有许多总结变化的供给。每一趟都写三个经过来生成js代码从而渲染总结报表也是个很麻烦的思想政治工作。于是小编就计划写三个工具,大约的笔触正是重视修改配置文件就足以一贯扭转总括报表,报表的页面为了美貌作者引入了bootstrap 三.0。于是开采这种数据存款和储蓄mongo,加上配置文件生成报表的方式是很轻巧实现,也确确实实很好利用。乃至于您在mongo中扩充了1种总结结构,作者能够怎么都并非修改,只须求追加贰个布署项就能够生成新总结结构的图纸了,那大概是归功于mongo的json结构化。

/*
 * project:列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段;
 * match:搜索条件criteria
 * unwind:某一个字段是集合,将该字段分解成数组
 * group:分组的字段,以及聚合相关查询
 *   sum:求和(同sql查询)
 *   count:数量(同sql查询)
 *   as:别名(同sql查询)
 *   addToSet:将符合的字段值添加到一个集合或数组中
 * sort:排序
 * skip&limit:分页查询
 */
public List<CustomerDetail> customerDetailList(Integer pageNum,String userId,String buyerNick,String itemId,List<String> phones) throws Exception{
 Criteria criteria = Criteria.where("userId").is(userId);
 Integer pageSize = 10;
 Integer startRows = (pageNum - 1) * pageSize;
 if(buyerNick != null && !"".equals(buyerNick)){
  criteria.and("buyerNick").is(buyerNick);
 }
 if(phones != null && phones.size() > 0){
  criteria.and("mobile").in(phoneList);
 }
 if(itemId != null && !"".equals(itemId)){
  criteria.and("orders.numIid").is(itemId);
 }
 Aggregation customerAgg = Aggregation.newAggregation(
   Aggregation.project("buyerNick","payment","num","tid","userId","address","mobile","orders"),
   Aggregation.match(criteria),
               Aggregation.unwind("orders"),
   Aggregation.group("buyerNick").first("buyerNick").as("buyerNick").first("mobile").as("mobile").
   first("address").as("address").sum("payment").as("totalPayment").sum("num").as("itemNum").count().as("orderNum"),
   Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC, "totalPayment"))),
   Aggregation.skip(startRows),
   Aggregation.limit(pageSize)
   );
 List<CustomerDetail> customerList = tradeRepository.findAggregateList(new Query(criteria), userId, customerAgg,CustomerDetail.class);
 return customerList;
}

稍复杂的操作

威尼斯真人网上娱乐,先交付多少个collection的多寡,然后按操作符按需成功例,==每回操作后均将数据复苏==。
数据如下,之后的操作都遵照那些数据


statpot工具

以此工具statpot开源在github上了:

能够下载result/stat_二零一二0九二五.html来看变化的报表。

变化的报表如下:

威尼斯真人网上娱乐 3

最近是贯彻了三种:饼图和柱状图。后续有希望的话还会一而再增进某个其它计算图表。

还是能体悟的一个主题素材是那个页面假若是动态的,那么一定实时深入分析必要的时刻比较多,而计算报表一般没有要求动态的,所以完全可以做成生成静态文件的点子,于是web/目录下就有动态和静态的入口。这种变化静态报表然后存款和储蓄的秘籍也是很好的,比方每日本人生成壹次动态报表,然后就把mongo中的数码清空或那静态文件化。

自然后来思维,这种唯配置至上的工具唯一的害处是计划本人正是一种学习开支,你须求花时间来驾驭那个布局。不过那么些主题素材在笔者眼里,和代码一样,应该由安插的语义来解决。

  

users表,用户保存用户音讯,保存用户名称,年龄消息
    /* 1 */
    {
        "_id" : ObjectId("592ee1871855e63d5a44e614"),
        "name" : "jack",
        "age" : 24.0
    }

    /* 2 */
    {
        "_id" : ObjectId("592ee2691855e63d5a44e615"),
        "name" : "rose",
        "age" : 27.0
    }

标题记录

记录下支付进程中非常是应用mongo中蒙受的标题:

public <T> List<T> findAggregateList(Query query,String userNickName, Aggregation aggregation,Class<T> clazz) {
 String collectionName = getCollectionName(userNickName);
 AggregationResults<T> aggregate = this.mongoTemplate.aggregate(aggregation, collectionName, clazz);
 List<T> customerDetails = aggregate.getMappedResults();
 return customerDetails;
}
orders表,用于保存订单音讯,存有订单总价,订单创制时间,订单状态,订单用户id及订单详细情形
    /* 1 */
    {
        "_id" : ObjectId("592ecb0c1855e63d5a44e609"),
        "amount" : 22000,
        "user_id" : ObjectId("592ee1871855e63d5a44e614"),
        "create_time" : ISODate("2017-06-04T04:43:58.769Z"),
        "status" : "success",
        "goods" : [ 
            {
                "name" : "《javascript权威指南》",
                "type" : "book",
                "price" : 50.0,
                "number" : 2,
                "good_id" : ObjectId("592ecb9d1855e63d5a44e60b")
            }, 
            {
                "name" : "iphone 7",
                "type" : "phone",
                "price" : 7000,
                "number" : 3,
                "good_id" : ObjectId("592ecb821855e63d5a44e60a")
            }
        ]
    }
    /* 2 */
    {
        "_id" : ObjectId("592ecd7b1855e63d5a44e60f"),
        "amount" : 4080,
        "user_id" : ObjectId("592ee2691855e63d5a44e615"),
        "create_time" : ISODate("2017-06-04T04:43:58.769Z"),
        "status" : "success",
        "goods" : [ 
            {
                "name" : "Moto Z",
                "type" : "phone",
                "price" : 4000.0,
                "number" : 1,
                "good_id" : ObjectId("592ecbdf1855e63d5a44e60d")
            }, 
            {
                "name" : "《shell编程》",
                "type" : "book",
                "price" : 40.0,
                "number" : 2,
                "good_id" : ObjectId("592ecbb61855e63d5a44e60c")
            }
        ]
    }
    /* 3 */
    {
        "_id" : ObjectId("5932bcd90682be14a892ea13"),
        "amount" : 8000.0,
        "user_id" : ObjectId("592ee1871855e63d5a44e614"),
        "create_time" : ISODate("2017-06-04T04:43:58.769Z"),
        "goods" : [ 
            {
                "name" : "Moto Z",
                "type" : "phone",
                "price" : 8000.0,
                "number" : 2.0,
                "good_id" : ObjectId("592ecbdf1855e63d5a44e60d")
            }
        ]
    }

哪些得到3个字段的全体一点都不小只怕的值

使用distinct

威尼斯真人网上娱乐 4

怎么收获1个字段的富有希望的值,并且计算出各类值有多少个条约

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:mongo进行Aggregation聚合查询,highcharts做统计报表

关键词: 澳门威利斯人 日记本