函数分组学通MongoDB——第三天 细说高级操作
改章節個人在廣東喝咖啡的時候突然想到的...明天就有想寫幾篇關于函數分組的文章,所以回家到后之就奮筆疾書的寫出來發布了
????明天跟大家分享一下mongodb中比擬好玩的識知,要主括包:聚合,標游。
????一: 聚合
? ? ? 見常的聚合作操跟sql server一樣,有:count,distinct,group,mapReduce。
????<1> count
? ? ? ? count是最單簡,最易容,也是最經常使用的聚合工具,它的用使跟我們C#里頭的count用使簡直樣一模一。
????
?
????<2> distinct
? ? ? ?這個作操信相大家也是非常熟習的,指定了誰,誰就不能重復,直接上圖。
????
?
????<3> group
? ? 在mongodb里頭做group作操有點小龐雜,不過大家對sql server里頭的group比擬熟習的話還是一眼
????能看的明確的,其實group作操本質上形成了一種“k-v”模型,就像C#中的Dictionary,好,有了這類維思,
????我們來看看如何用使group。
? ? 面下舉的例子就是按照age行進group作操,value為對應age的姓名。面下對這些數參紹介一下:
? ? ? ?key: ?這個就是分組的key,我們這里是對春秋分組。
? ? ? ?initial: 每組都分享一個”初始化函數“,特別注意:是每一組,比如這個的age=20的value的list分享一個
????initial函數,age=22一樣也分享一個initial函數。
? ? ? ?$reduce: 這個函數的第一個數參是前當的文檔對象,第二個數參是上一次function作操的累計對象,第一次
????為initial中的{”perosn“:[]}。有多少個文檔, $reduce就會調用多少次。
????
? ?看到面下的結果,是否是有點感到,我們通過age看查到了應相的name職員,不過偶然我們可能有如下的求要:
? ? ?①:想過濾掉age>25一些職員。
? ? ?②:偶然person組數里頭的職員太多,我想加上一個count屬性明標一下。
?針對面下的需求,在group里頭還是很好辦到的,因為group有這么兩個可選數參: condition 和 finalize。
? ? ?condition: ?這個就是過濾件條。
? ? ?finalize:這是個函數,每一組文檔執行完后,多會觸發此方法,那么在每組合集里頭加上count也就是它的活了。
????
每日一道理心是一棵樹,愛與希望的根須扎在土里,智慧與情感的枝葉招展在藍天下。無論是歲月的風雨撲面而來,還是滾滾塵埃遮蔽了翠葉青枝,它總是靜默地矗立在那里等待,并接受一切來臨,既不倨傲,也不卑微。
心是一棵樹,一個個故事被年輪攜載;一回回驛動與飛鳥相約;一次次碰撞使它綿密柔韌;一幕幕經歷造就了它博廣的胸懷。心是一棵樹,獨木不成林。因此,樹與樹既獨立又相聯,心與心既相異又相親。
?
????<4> mapReduce
? ? ? ? 這玩意算是聚合函數中最龐雜的了,不過龐雜也好,越龐雜就越活靈。
? mapReduce實際上是一種編程模型,用在分布式計算中,其中有一個“map”函數,一個”reduce“函數。
? ?① map:
? ? ? ? ? 這個稱為射映函數,里頭會調用emit(key,value),合集會按照你指定的key行進射映分組。
? ?② reduce:
? ? ? ? ?這個稱為簡化函數,會對map分組后的數據行進分組簡化,注意:在reduce(key,value)中的key就是
? ? ? emit中的key,vlaue為emit分組后的emit(value)的合集,這里也就是很多{"count":1}的組數。
? ?③ mapReduce:
? ? ? ? ? 這個就是最后執行的函數了,數參為map,reduce和一些可選數參。體具看圖可知:
????
?
????從圖中我們可以看到如下信息:
? ? ? ?result: "放存的合集名“;
? ? ? ?input:傳入文檔的個數。
? ? ? ?emit:此函數被調用的數次。
? ? ? ?reduce:此函數被調用的數次。
? ? ? ?output:最后返回文檔的個數。
????最后我們看一下“collecton”合集里頭按姓名分組的情況。
????
?
????二:標游
? ? mongodb里頭的標游有點相似我們說的C#里頭延遲執行,比如:
? ? ? var list=db.person.find();
? ? 針對這樣的作操,list其實并沒有取獲到person中的文檔,而是明申一個“查詢結構”,等我們要需的時候通過
????for或者next()一次性載加過去,然后讓標游逐行讀取,當我們枚舉完了后之,標游毀銷,后之我們在通過list取獲時,
????發明沒有數據返回了。
????
?
????當然我們的“查詢造構”還可以弄的龐雜點,比如分頁,排序都可以加進去。
?var single=db.person.find().sort({"name",1}).skip(2).limit(2);
????那么這樣的“查詢造構”可以在我們要需執行的時候執行,大大提高了不必要的花消。
????
文章結束給大家分享下程序員的一些笑話語錄: 看新聞說中國輸入法全球第一!領先了又如何?西方文字根本不需要輸入法。一點可比性都沒有。
轉載于:https://www.cnblogs.com/jiangu66/archive/2013/05/01/3053009.html
總結
以上是生活随笔為你收集整理的函数分组学通MongoDB——第三天 细说高级操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 Yii框架中使用session 的笔
- 下一篇: TDD:MS自带的单元测试 之 线程模型