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