本篇文章給大家分享的是有關(guān)如何在mongoDB中利用java處理聚合函數(shù),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)通海,十多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792需要對document中的一個tweet_list 集合中的一個屬性 timestamp_ms進(jìn)行排序。 組內(nèi)排序
使用聚合框架,通過match,unwind,sort等不同的組件創(chuàng)建一個管道。
類似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實現(xiàn)此聚合函數(shù)
java中的Aggregation類,查詢條件的順序決定結(jié)果。
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") ); AggregationResultsresults = mongoTemplate.aggregate(agg, "text", JSONObject.class); //System.out.println("results"+results.getRawResults()); //獲取到的結(jié)果是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.擴(kuò)展
管道pipeline
以下的管道操作符可以按照任意順序組合在一起使用。每個操作符都會接受一連串文檔,對這些文檔做了類型轉(zhuǎn)換后,將轉(zhuǎn)換后的文檔作為結(jié)果傳遞給下一個操作符。直到最后一個管道操作符,將結(jié)果返回給客戶端。
篩選match
盡可能將帥選放在管道的前部。兩個原因:
1.先過濾掉不需要的文檔,減少管道的工作量。
2.如果在project和group之前執(zhí)行match,查詢可以用索引。
3.不能在match中使用地理空間操作符
投射project
類似select操作。可以用管道表達(dá)式,數(shù)學(xué)表達(dá)式,日期表達(dá)式,字符表達(dá)式,邏輯表達(dá)式等。
分組group
跟mysql中的分組比較像
排序sort
1 升序 -1 降序
限制limit
限制結(jié)果條數(shù)
跳過skip
丟棄結(jié)果中的前n個文檔
拆分unwind
把數(shù)組中的每個值拆分為單獨的文檔,例如此問題中需要對一個document中的tweetlist進(jìn)行排序,可以使用unwind把tweetlist中的不同map拆分成不同的文檔。
結(jié)果返回
文檔
MapReduce
如果聚合框架中查詢語言不能不表達(dá),需要用到MapReduce。
使用:把問題拆分為多個小問題,把各個小問題發(fā)送到不同的機(jī)器上,每臺機(jī)器只負(fù)責(zé)完成一部分的工作,完成之后,再把零碎的解決方案合并。
步驟:
1.映射map:把操作映射到集合中每個文檔
2.洗牌shuffle:按照鍵值分組,并將產(chǎn)生的鍵值組成列表放到對應(yīng)的鍵中。
3.化簡reduce:把列表中的值化簡成一個單值,值被返回,繼續(xù)shuffle,然后最終每個鍵的列表只有一個值,即最終結(jié)果,
以上就是如何在mongoDB中利用java處理聚合函數(shù),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。