mongodb 怎麼算分組 topN

更多技術內容可以參考原文,因爲是轉載,有些內容沒轉全:http://c.raqsoft.com.cn/article/1554189737721?r=CGQ

 

在統計應用項目中,我們經常會遇到這樣的需求:將大量的對象進行排序,然後只需要取出前 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)  

 

更多技術內容可以參考原文,因爲是轉載,有些內容沒轉全:http://c.raqsoft.com.cn/article/1554189737721?r=CGQ

 

 

      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腳本容易多了。

 

 

更多技術內容可以參考原文,因爲是轉載,有些內容沒轉全:http://c.raqsoft.com.cn/article/1554189737721?r=CGQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章