时间:2021-05-24
1.问题
最近在做项目的时候碰到一个对mongoDB的数据处理,从MongoDB中拿到内嵌文档的时间排序的list。
一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,所以处理中需要用到聚合函数。
思考
(key)解决这个问题的过程让我学到很多,发现自己在解决一个问题不仅查找问题的姿势不对,浪费太多时间。而且在碰到问题之后,应该多看看解决办法,甚至解决了之后要去思考问题,回顾问题。而不是像以前一样,解决问题了就万事大吉,抛之脑后。
2.解决
需要对document中的一个tweet_list 集合中的一个属性 timestamp_ms进行排序。 组内排序
使用聚合框架,通过match,unwind,sort等不同的组件创建一个管道。
类似mysql中的多层嵌套子查询。
mongoDB中js代码
java实现此聚合函数
java中的Aggregation类,查询条件的顺序决定结果。
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.网页分类
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操作的一种方式——MapReduce,但是在大
Java使用continue语句的实例详解在Java中,如何使用使用continue语句?下面示例中,演示如何使用continue语句跳过循环(实现统计指定字母
Java中synchronize函数的实例详解java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步
支持聚合函数的方法:提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就必须把这些聚合函数放
MongoDB中Limit与Skip的使用方法详解一MongoDBLimit()方法如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的