• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    mongoDB中聚合函数java处理示例详解

    1.问题

    最近在做项目的时候碰到一个对mongoDB的数据处理,从MongoDB中拿到内嵌文档的时间排序的list。

    一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,所以处理中需要用到聚合函数。

    思考

    (key)解决这个问题的过程让我学到很多,发现自己在解决一个问题不仅查找问题的姿势不对,浪费太多时间。而且在碰到问题之后,应该多看看解决办法,甚至解决了之后要去思考问题,回顾问题。而不是像以前一样,解决问题了就万事大吉,抛之脑后。

    2.解决

    需要对document中的一个tweet_list 集合中的一个属性 timestamp_ms进行排序。 组内排序

    使用聚合框架,通过match,unwind,sort等不同的组件创建一个管道。

    类似mysql中的多层嵌套子查询。

    mongoDB中js代码

    db.text.aggregate(
     // Initial document match (uses index, if a suitable one is available)
     [
     { $match: {
      _id : ObjectId("5ca95b4bfb60ec43b5dd0db5")
     }},
    
     // Expand the scores array into a stream of documents
     { $unwind: '$tweet_list' },
      
      { $match: {
       'tweet_list.timestamp_ms': '1451841845660'
      }},
    
     // Sort in descending order
     { $sort: {
      'tweet_list.timestamp_ms': 1
     }}
     ]
    )

    java实现此聚合函数

    java中的Aggregation类,查询条件的顺序决定结果。

    Aggregation agg = Aggregation.newAggregation(
      Aggregation.match(Criteria.where("_id").is(id)),
      Aggregation.unwind("tweet_list"),
      Aggregation.sort(Sort.Direction.ASC,"tweet_list.timestamp_ms"),
      Aggregation.project("tweet_list.timestamp_ms","tweet_list.text","tweet_list.created_at")
    
    );
    AggregationResultsJSONObject> results = mongoTemplate.aggregate(agg, "text", JSONObject.class);
    //System.out.println("results"+results.getRawResults()); //获取到的结果是document
    //String res = results.getRawResults();
    String json = com.mongodb.util.JSON.serialize(results.getRawResults());
    System.out.println("JSON serialized Document: " + json);
    JSONObject jso= JSON.parseObject(json);
    JSONArray resultss=jso.getJSONArray("results");
    System.out.println(resultss);

    3.扩展

    管道pipeline

    以下的管道操作符可以按照任意顺序组合在一起使用。每个操作符都会接受一连串文档,对这些文档做了类型转换后,将转换后的文档作为结果传递给下一个操作符。直到最后一个管道操作符,将结果返回给客户端。

    筛选match

    尽可能将帅选放在管道的前部。两个原因:

    1.先过滤掉不需要的文档,减少管道的工作量。

    2.如果在project和group之前执行match,查询可以用索引。

    3.不能在match中使用地理空间操作符

    投射project

    类似select操作。可以用管道表达式,数学表达式,日期表达式,字符表达式,逻辑表达式等。

    分组group

    跟mysql中的分组比较像

    排序sort

    1 升序 -1 降序

    限制limit

    限制结果条数

    跳过skip

    丢弃结果中的前n个文档

    拆分unwind

    把数组中的每个值拆分为单独的文档,例如此问题中需要对一个document中的tweetlist进行排序,可以使用unwind把tweetlist中的不同map拆分成不同的文档。

    结果返回

    文档

    MapReduce

    如果聚合框架中查询语言不能不表达,需要用到MapReduce。

    使用:把问题拆分为多个小问题,把各个小问题发送到不同的机器上,每台机器只负责完成一部分的工作,完成之后,再把零碎的解决方案合并。

    步骤:

    1.映射map:把操作映射到集合中每个文档

    2.洗牌shuffle:按照键值分组,并将产生的键值组成列表放到对应的键中。

    3.化简reduce:把列表中的值化简成一个单值,值被返回,继续shuffle,然后最终每个键的列表只有一个值,即最终结果,

    应用:

    1.找到集合中所有键

    2.网页分类

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • java操作elasticsearch的案例解析
    • 利用Java多线程技术导入数据到Elasticsearch的方法步骤
    • JAVA使用ElasticSearch查询in和not in的实现方式
    • java 使用ElasticSearch完成百万级数据查询附近的人功能
    • 使用java操作elasticsearch的具体方法
    • 基于Lucene的Java搜索服务器Elasticsearch安装使用教程
    • JAVA mongodb 聚合几种查询方式详解
    • mongodb聚合_动力节点Java学院整理
    • java使用elasticsearch分组进行聚合查询过程解析
    上一篇:mongo中模糊查询的综合应用
    下一篇:Ubuntu 18.04安装MongoDB 4.0 的教程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    mongoDB中聚合函数java处理示例详解 mongoDB,中,聚合,函数,java,