使用BmobJava云函數統計數據


云函數簡介

云函數是一段部署在服務端的代碼片段,通過云函數可以解決很多復雜的業務邏輯,無需將大量的數據發送到客戶端做計算處理,大大減輕了客戶端業務開發的復雜度。
另外,更新云函數代碼片段,客戶端無需更新,便滿足業務改動的需求,這樣云函數便有更多的靈活性和自主性。

編程語言

目前Bmob云函數支持Node.js和Java兩種編程語言。

云函數執行方式

創建好的云函數支持三種執行方式:

  • 定時任務
    在服務端創建并設置定時任務規則后定時執行指定的云函數
  • RESTful Api調用
    通過Restful api接口調用指定云函數返回執行結果
  • SDK調用
    通過Bmob數據服務提供的相關平臺SDK中提供的方法調用指定云函數

數據準備

字段 數據類型 描述
username String 用戶名
password String 密碼
type Integer 用戶類型(1普通用戶、2高級用戶)

假設現在有一張用戶表_User存儲注冊的用戶信息,主要的基本字段如下:

字段 數據類型 描述
username String 用戶名
password String 密碼
type Integer 用戶類型(1普通用戶、2高級用戶)

需求

老板要求統計每天不同類型的用戶注冊量

創建云函數

1.在Bmob控制臺創建countRegister的云函數

2.創建后臺的countRegister云函數的默認內容

3.在onRequest方法體中我們將實現注冊量統計的邏輯,這里需要注意幾點:

  • 方法名、入參及返回類型不允許任何修改
  • 代碼中不能包含以下關鍵字
    Class
    File
    System
    ...
  • 需要獲取當前毫秒時,可用 getTime() 、new java.util.Date().getTime() 替代 System.currentTimeMillis()
  • 如果確實需要用到被禁止使用的關鍵字,例如查詢"File"表,可用"F"+"ile"的形式拼接
  • 不可包含/**/注釋,如需注釋,請用 //
  • 僅可寫一個Java的方法,不能寫多個方法、類變量、靜態變量等
  • 云函數執行完畢后,必須用response.send方法返回響應數據,否則會被當做超時,多次超時可能會被暫停使用

了解了以上規則后我們就來開始編寫統計數據的代碼:

// 按type字段進行分組統計
Querier qt = new Querier("_User")
                .limit(1000)
                .groupby("type")
                .groupcount(true);
// 條件 = 創建時間在12小時內
qt.addWhereGreaterThanOrEqualTo("createdAt", new BmobDate(getTime() - 12 * 60 * 60 * 1000));
// 使用oData對象的find方法進行數據的查詢統計
HttpResponse httpResponse = modules.oData.find(qt);
// 將查詢統計得到的數據通過httpResponse返回給調用云函數的請求方
response.send(httpResponse.jsonData);

調用云函數

調用方式 所需信息 優點
SDK AppId 交互自帶加密,接入快速
RestApi AppId、RestKey 所有平臺適用,通用性強
Http請求 Secret Key 所有平臺適用,可用瀏覽器打開

云函數的調用支持以下幾種方式:

調用方式 所需信息 優點
SDK AppId 交互自帶加密,接入快速
RestApi AppId、RestKey 所有平臺適用,通用性強
Http請求 Secret Key 所有平臺適用,可用瀏覽器打開
username password type
zhangsan 123456 1
lisi 123456 2
wangwo 123456 1

這里使用Http請求的方式調用countRegister云函數進行測試,在瀏覽器中請求如下地址:https://javacloud.bmob.cn/****/countRegister,星號請替換為您Bmob應用的SectetKey,
這個時候假設當前_User表中存儲的數據如下:

username password type
zhangsan 123456 1
lisi 123456 2
wangwo 123456 1

執行此云函數返回的Json數據將是如下結果:

{"results":[{"_count":1,"type":2},{"_count":2,"type":1}]}

results中的結果分別是普通用戶(type=1)和高級用戶(type=2)的注冊總數。
到此已經實現了基本的統計操作,主要是在云函數中使用了數據服務的查詢功能來進行統計查詢。而實際的業務中可能需要我們將統計的結果存儲到相關的數據表中方便以后做報表展示,所以我們接下來繼續完善一下這個countRegister云函數,將統計的結果存儲到一張表中。

保存統計數據

字段 數據類型 描述
generalUserCount Integer 普通用戶注冊數量
advancedUserCount Integer 高級用戶注冊數量

新建一個Statistics表,存儲統計后的結果,結構如下:

字段 數據類型 描述
generalUserCount Integer 普通用戶注冊數量
advancedUserCount Integer 高級用戶注冊數量

加入存儲統計數據的代碼

// 按type字段進行分組統計
Querier qt = new Querier("_User")
                .limit(1000)
                .groupby("type")
                .groupcount(true);
// 條件 = 創建時間在12小時內
qt.addWhereGreaterThanOrEqualTo("createdAt", new BmobDate(getTime() - 12 * 60 * 60 * 1000));
// 使用oData對象的find方法進行數據的查詢統計
HttpResponse httpResponse = modules.oData.find(qt);
// 將查詢統計得到的數據通過httpResponse返回給調用云函數的請求方
//response.send(httpResponse.jsonData);
        
JSONArray results = httpResponse.jsonData.getJSONArray("results");
if (results == null) {
    response.send(httpResponse.data);   // 請求有錯誤,直接返回全部內容
} else {
    JSONObject statisticsData = new JSONObject();
    for(int i = 0; i < results.size(); i++){
        JSONObject obj = results.getJSONObject(i);
        int type = obj.getInteger("type");
        int count = obj.getInteger("_count");
        if(type == 1){
            // 普通用戶總數
            statisticsData.put("generalUserCount", count);
        }else if(type == 2){
            // 高級用戶總數
            statisticsData.put("advancedUserCount", count);
        }
    }
    // 保存數據并返回執行結果
    response.send(modules.oData.insert("Statistics", statisticsData).stringData);
}

保存好代碼后再次調用該云函數,返回結果如下:

{"createdAt": "2017-12-27 16:04:35","objectId": "8401a6d2d9"}

表示插入Statistics表數據成功后返回的數據objectId和創建時間,Bmob控制臺數據瀏覽Statistics表,已經存在統計后的數據了。

定時任務

上面的云函數已經基本完成了用戶注冊數的統計以及保存統計數據的工作,但是當我們需要統計的時候還需要手動的調用countRegister云函數才行。實際上我們可以創建一個定時任務在固定時間來執行這個統計操作。在云函數的編寫頁面選擇定時任務,設置執行規則后保存即可,具體設置如下:

timing_tasks.png

上面的規則是每天的23點執行該云函數,定時任務的執行規則可以參考定時任務文檔說明。

總結

本文以一個統計用戶注冊數量的簡單實例來講解了Bmob云函數的使用,主要在云函數中使用到了數據服務的查詢數據和插入數據來實現,并在最后介紹了定時任務+云函數的搭配使用。很多時候,單純的前端代碼是不能完成全部事情的,一些重要和復雜的業務邏輯還是希望能夠在服務端中執行。比如:對比較大量的比賽數據進行排序、對某些數據進行分析和處理、獲取用戶的IP信息等等。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,067評論 6 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,707評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • 上周畫了草稿,這周描的邊~好怕勾邊,總是感覺手一抖,壞了┐( ̄ー ̄)┌ 這周工作好忙,每天只能畫個草稿,勾邊都是之...
    NickyL閱讀 164評論 2 0
  • 親愛的自己,從今天起,讓自己平平淡淡的活著,學著愛自己,你是獨一無二的,做個最真實最快樂最陽光的自己。 親愛的自己...
    Tina娜子閱讀 204評論 0 0