最近在作项目的时候碰到一个对mongoDB的数据处理,从MongoDB中拿到内嵌文档的时间排序的list。
一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,因此处理中须要用到聚合函数。java
(key)解决这个问题的过程让我学到不少,发现本身在解决一个问题不只查找问题的姿式不对,浪费太多时间。并且在碰到问题以后,应该多看看解决办法,甚至解决了以后要去思考问题,回顾问题。而不是像之前同样,解决问题了就万事大吉,抛之脑后。mysql
须要对document中的一个tweet_list 集合中的一个属性 timestamp_ms进行排序。 组内排序sql
使用聚合框架,经过match,unwind,sort等不一样的组件建立一个管道。
相似mysql中的多层嵌套子查询。mongodb
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中的Aggregation类,查询条件的顺序决定结果。json
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")
);
AggregationResults<JSONObject> 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);
复制代码
如下的管道操做符能够按照任意顺序组合在一块儿使用。每一个操做符都会接受一连串文档,对这些文档作了类型转换后,将转换后的文档做为结果传递给下一个操做符。直到最后一个管道操做符,将结果返回给客户端。数组
尽量将帅选放在管道的前部。两个缘由:
1.先过滤掉不须要的文档,减小管道的工做量。
2.若是在project和group以前执行match,查询能够用索引。
3.不能在match中使用地理空间操做符框架
相似select操做。能够用管道表达式,数学表达式,日期表达式,字符表达式,逻辑表达式等。函数
跟mysql中的分组比较像ui
1 升序 -1 降序spa
限制结果条数
丢弃结果中的前n个文档
把数组中的每一个值拆分为单独的文档,例如此问题中须要对一个document中的tweetlist进行排序,可使用unwind把tweetlist中的不一样map拆分红不一样的文档。
文档
若是聚合框架中查询语言不能不表达,须要用到MapReduce。
使用:把问题拆分为多个小问题,把各个小问题发送到不一样的机器上,每台机器只负责完成一部分的工做,完成以后,再把零碎的解决方案合并。
步骤:
1.映射map:把操做映射到集合中每一个文档
2.洗牌shuffle:按照键值分组,并将产生的键值组成列表放到对应的键中。
3.化简reduce:把列表中的值化简成一个单值,值被返回,继续shuffle,而后最终每一个键的列表只有一个值,即最终结果,
应用: 1.找到集合中全部键 2.网页分类