來源:https://groups.google.com/forum/#!topic/mongodb-user/Rjv6lyUCe1s 在統(tǒng)計(jì)應(yīng)用項(xiàng)目中,我們經(jīng)常會(huì)遇到這樣的需求:將大量的對(duì)象進(jìn)行排序,然后只需要取出前 N 名作為排行榜的數(shù)據(jù),這就是 TopN 算法。mongodb作為nosql數(shù)據(jù)庫的典型代表,能夠存儲(chǔ)海量數(shù)據(jù),在使用過程中也經(jīng)常會(huì)遇到TopN的需求,例如將需要字段的最新數(shù)據(jù)從mongodb中獲取出來。下面就使用集算器 SPL 語言操作,通過案例分析如何實(shí)現(xiàn)上述功能。 Collection last3有兩個(gè)字段:variable和timestamp,這里首先按variable分組,然后在每組文檔中選出timestamp最晚的3個(gè),最后再從這些文檔中找到timestamp最早的1個(gè)。 last3的部分?jǐn)?shù)據(jù)如下:
集算器代碼:
A1:連接MongoDB,連接字格式為mongo://ip:port/db?arg=value&…。 A2:使用find函數(shù)從MongoDB中取數(shù)并排序,形成游標(biāo)。collectoin是last3,過濾條件是空,取出_id之外的所有字段,并按variable排序。 A3:循環(huán)從游標(biāo)讀數(shù),每次取variable字段相同的一組文檔。A3循環(huán)的的作用范圍是縮進(jìn)的B3到B4,在這個(gè)范圍中可以用A3來引用循環(huán)變量,這里A3是內(nèi)存數(shù)據(jù),在調(diào)試方式下可以查看某次取數(shù)的結(jié)果如下:
B3:選出本組文檔中timestamp最晚(大)的3個(gè)。 B4:將B3不斷地追加到B4中。B4如下:
A5:選出B4中timstamp最早(?。┑哪莻€(gè)文檔,即:
A6:關(guān)閉mongodb連接。 實(shí)現(xiàn)類似Mongodb的topN的需求,使用SPL語言能簡化mongodb shell的實(shí)現(xiàn),相對(duì)mongodb腳本容易多了。 |
|