在統計應用項目中,我們經常會遇到這樣的需求:將大量的對象進行排序,然后只需要取出前 N 名作為排行榜的數據,這就是 TopN 算法。mongodb作為nosql數據庫的典型代表,能夠存儲海量數據,在使用過程中也經常會遇到TopN的需求,例如將需要字段的最新數據從mongodb中獲取出來。下面就使用集算器 SPL 語言操作,通過案例分析如何實現上述功能。
Collection last3有兩個字段:variable和timestamp,這里首先按variable分組,然后在每組文檔中選出timestamp最晚的3個,最后再從這些文檔中找到timestamp最早的1個。
last3的部分數據如下:
{"_id" : ? ObjectId("54f69645e4b077ed8d997857"),"variable" : ? "A", "timestamp" : ISODate("1995-01-01T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997856"),"variable" : ? "A", "timestamp" : ISODate("1995-01-02T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997855"),"variable" : ? "A", "timestamp" : ISODate("1995-01-03T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997854"),"variable" : ? "B", "timestamp" : ISODate("1995-01-02T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997853"),"variable" : ? "B", "timestamp" : ISODate("1995-01-01T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997852"),"variable" : ? "B", "timestamp" : ISODate("1994-01-03T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997851"),"variable" : ? "C", "timestamp" : ISODate("1994-01-03T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997850"),"variable" : ? "C", "timestamp" : ISODate("1994-01-02T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997858"),"variable" : ? "C", "timestamp" : ISODate("1994-01-01T00:00:00Z")} {"_id" : ? ObjectId("54f69645e4b077ed8d997859"),"variable" : ? "C", "timestamp" : ISODate("1993-01-01T00:00:00Z")} |
集算器代碼:
A | B | |
1 | =mongo_open("mongodb://localhost:27017/local?user=test&password=test") | |
2 | =mongo_shell(A1,"last3.find(,{_id:0};{variable:1})") | |
3 | for A2;variable | =A3.top(3;-timestamp) |
4 | =@|B3 | |
5 | =B4.minp(~.timestamp) | |
6 | =mongo_close(A1) |
A1:連接MongoDB,連接字格式為mongo://ip:port/db?arg=value&…。
A2:使用find函數從MongoDB中取數并排序,形成游標。collectoin是last3,過濾條件是空,取出_id之外的所有字段,并按variable排序。
A3:循環從游標讀數,每次取variable字段相同的一組文檔。A3循環的的作用范圍是縮進的B3到B4,在這個范圍中可以用A3來引用循環變量,這里A3是內存數據,在調試方式下可以查看某次取數的結果如下:
variable | timestamp |
C | 1994-01-03 08:00:00 |
C | 1994-01-02 08:00:00 |
C | 1994-01-01 08:00:00 |
C | 1993-01-01 08:00:00 |
B3:選出本組文檔中timestamp最晚(大)的3個。
B4:將B3不斷地追加到B4中。B4如下:
variable | timestamp |
A | 1995-01-03 08:00:00 |
A | 1995-01-02 08:00:00 |
A | 1995-01-01 08:00:00 |
B | 1995-01-02 08:00:00 |
B | 1995-01-01 08:00:00 |
B | 1994-01-03 08:00:00 |
C | 1994-01-03 08:00:00 |
C | 1994-01-02 08:00:00 |
C | 1994-01-01 08:00:00 |
A5:選出B4中timstamp最早(小)的那個文檔,即:
variable | timestamp |
C | 1994-01-01 08:00:00 |
A6:關閉mongodb連接。
實現類似Mongodb的topN的需求,使用SPL語言能簡化mongodb shell的實現,相對mongodb腳本容易多了。
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前題目:mongodb分組topN-創新互聯
標題網址:http://www.yijiale78.com/article20/cdpjjo.html
成都網站建設公司_創新互聯,為您提供做網站、App開發、手機網站建設、商城網站、自適應網站、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯