實現 MongoDB 外來鍵關聯

嘟嘟是隻喵發表於2019-09-21

【摘要】

        Mongodb 作為分散式檔案儲存的資料庫,想實現多表關聯 JOIN 查詢並非易事。但通過集算器 SPL 語言,在 Mongodb 中多個表的外來鍵關聯查詢,完全可以做到像關聯式資料庫那樣方便容易。若想了解更多,請前往乾學院: 實現 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的程式碼如下:

        A1: 連線MongoDB,連線字格式為mongo://ip:port/db?arg=value&…。

        A2: 統計出每門課的人數。這裡使用MongoDB聚合函式aggregate在UserCourseProgress中取數,引數是遵循mongodb規範的彙總表示式。計算結果是記憶體資料,如下:

         Picture 1

        A3: 用find函式從Course中取數,過濾條件為空。Find的結果是遊標,由於課程數量較少,因此用可以fetch函式將遊標讀入記憶體,結果如下:

          Picture 4

         A4: 使用switch函式將A3中的外來鍵切換為A2中的記錄,結果如下:

          Picture 7

        A5:按物件方式訪問記憶體,形成新的二維表,結果如下:

         Picture 10

        A6:關閉mongodb連線。

        通過上面的例子可以看到,藉助集算器SPL語言,在Mongodb中多個表的外來鍵關聯查詢,完全可以做到像關聯式資料庫那樣方便、容易、直觀,不必擔心因為Mongodb是非關係型資料庫而帶來的表間弱關聯的影響。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543054/viewspace-2657823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章