mongoDB中聚合函數java處理

1.問題

最近在作項目的時候碰到一個對mongoDB的數據處理,從MongoDB中拿到內嵌文檔的時間排序的list。
一開始考慮到直接對mongoDB中的屬性排序,後面發現屬性存在內嵌文檔中,因此處理中須要用到聚合函數java

思考

key)解決這個問題的過程讓我學到不少,發現本身在解決一個問題不只查找問題的姿式不對,浪費太多時間。並且在碰到問題以後,應該多看看解決辦法,甚至解決了以後要去思考問題,回顧問題。而不是像之前同樣,解決問題了就萬事大吉,拋之腦後。mysql

2.解決

須要對document中的一個tweet_list 集合中的一個屬性 timestamp_ms進行排序。 組內排序sql

使用聚合框架,經過match,unwind,sort等不一樣的組件建立一個管道。
相似mysql中的多層嵌套子查詢。mongodb

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類,查詢條件的順序決定結果。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);
複製代碼

3.擴展

管道pipeline

如下的管道操做符能夠按照任意順序組合在一塊兒使用。每一個操做符都會接受一連串文檔,對這些文檔作了類型轉換後,將轉換後的文檔做爲結果傳遞給下一個操做符。直到最後一個管道操做符,將結果返回給客戶端。數組

篩選match

儘量將帥選放在管道的前部。兩個緣由:
1.先過濾掉不須要的文檔,減小管道的工做量。
2.若是在project和group以前執行match,查詢能夠用索引。
3.不能在match中使用地理空間操做符框架

投射project

相似select操做。能夠用管道表達式,數學表達式,日期表達式,字符表達式,邏輯表達式等。函數

分組group

跟mysql中的分組比較像ui

排序sort

1 升序 -1 降序spa

限制limit

限制結果條數

跳過skip

丟棄結果中的前n個文檔

拆分unwind

把數組中的每一個值拆分爲單獨的文檔,例如此問題中須要對一個document中的tweetlist進行排序,可使用unwind把tweetlist中的不一樣map拆分紅不一樣的文檔。

結果返回

文檔

MapReduce

若是聚合框架中查詢語言不能不表達,須要用到MapReduce。
使用:把問題拆分爲多個小問題,把各個小問題發送到不一樣的機器上,每臺機器只負責完成一部分的工做,完成以後,再把零碎的解決方案合併。
步驟:
1.映射map:把操做映射到集合中每一個文檔
2.洗牌shuffle:按照鍵值分組,並將產生的鍵值組成列表放到對應的鍵中。
3.化簡reduce:把列表中的值化簡成一個單值,值被返回,繼續shuffle,而後最終每一個鍵的列表只有一個值,即最終結果,
應用: 1.找到集合中全部鍵 2.網頁分類

相關文章
相關標籤/搜索