【摘要】
Mongodb 作爲分佈式文件存儲的數據庫,想實現多表關聯 JOIN 查詢並非易事。但通過集算器 SPL 語言,在 Mongodb 中多個表的外鍵關聯查詢,完全可以做到像關係數據庫那樣方便容易。
MongoDB 是一個分佈式文件存儲的數據庫,也是 nosql 中最像關係型數據庫的一種。但是 mongodb 採用文檔模式設計的,這意味着集合中的文檔可以有相同或不同的字段,因此在關係型數據庫非常擅長的多表關聯方面就顯得差強人意。如果採用 Mongodb 本身的 API 則需要硬編碼才能實現外鍵關聯,不夠直觀且難度較大,這種情況下可以用集算器 SPL 語言來實現,下面用例子說明。
Collection UserCourseProgress 記錄着用戶和課程的關係,其courseid字段是外鍵,指向Collection Course的_id字段。需要統計出每門課的人數,其中課程名稱需要使用Course的title字段進行顯示。
UserCourseProgress | Course |
{"userId":"u01", "courseid":"c01", "timespent":6000, score:99} {"userId":"u02", "courseid":"c01", "timespent":6000, score:99} {"userId":"u03", "courseid":"c01", "timespent":6000, score:99} {"userId":"u04", "courseid":"c01", "timespent":6000, score:99} {"userId":"u05", "courseid":"c01", "timespent":6000, score:99} {"userId":"u01", "courseid":"c02", "timespent":6000, score:99} {"userId":"u02", "courseid":"c02", "timespent":6000, score:99} {"userId":"u03", "courseid":"c03", "timespent":6000, score:99} | {"_id":"c01" "title":"Japanese159", "description":"Japanese base", "category":"language"} {"_id":"c02" "title":"Chinese200", "description":"Chinese middle", "category":"language"} {"_id":"c03" "title":"Political science 280", "description":"Political middle", "category":"politics"} {"_id":"c04" "title":"EE490", "description":"electronic engineering hign", "category":"Electronic"} |
使用集算器SPL的代碼如下:
A | |
1 | =mongo_open("mongodb://localhost:27017/local?user=test&password=test") |
2 | =mongo_shell(A1,"UserCourseProgress.aggregate([{$group: {_id: {'primary':'$courseid'},'popularityCount': {$sum: 1}}}, {$sort:{'popularityCount':-1}},{$project:{_id:0,'courseid':'$_id.primary','popularityCount':1}}])") |
3 | =mongo_shell(A1,"Course.find(,{title:1})").fetch() |
4 | =A2.switch(courseid,A3:_id) |
5 | =A4.new(popularityCount,courseid.title) |
6 | =mongo_close(A1) |
A1: 連接MongoDB,連接字格式爲mongo://ip:port/db?arg=value&…。
A2: 統計出每門課的人數。這裏使用MongoDB聚合函數aggregate在UserCourseProgress中取數,參數是遵循mongodb規範的彙總表達式。計算結果是內存數據,如下:
A3: 用find函數從Course中取數,過濾條件爲空。Find的結果是遊標,由於課程數量較少,因此用可以fetch函數將遊標讀入內存,結果如下:
A4: 使用switch函數將A3中的外鍵切換爲A2中的記錄,結果如下:
A5:按對象方式訪問內存,形成新的二維表,結果如下:
A6:關閉mongodb連接。
通過上面的例子可以看到,藉助集算器SPL語言,在Mongodb中多個表的外鍵關聯查詢,完全可以做到像關係數據庫那樣方便、容易、直觀,不必擔心因爲Mongodb是非關係型數據庫而帶來的表間弱關聯的影響。