實現 MongoDB 外鍵關聯

來源:http://stackoverflow.com/questions/29392169/populating-field-values-for-referred-documents-in-aggregate-call-in-mongoose  。sql

【摘要】
        Mongodb 做爲分佈式文件存儲的數據庫,想實現多表關聯 JOIN 查詢並不是易事。但經過集算器 SPL 語言,在 Mongodb 中多個表的外鍵關聯查詢,徹底能夠作到像關係數據庫那樣方便容易。mongodb

MongoDB 是一個分佈式文件存儲的數據庫,也是 nosql 中最像關係型數據庫的一種。可是 mongodb 採用文檔模式設計的,這意味着集合中的文檔能夠有相同或不一樣的字段,所以在關係型數據庫很是擅長的多表關聯方面就顯得差強人意。若是採用 Mongodb 自己的 API 則須要硬編碼才能實現外鍵關聯,不夠直觀且難度較大,這種狀況下能夠用集算器 SPL 語言來實現,下面用例子說明。shell

        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的代碼以下:electron


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&…。nosql

        A2: 統計出每門課的人數。這裏使用MongoDB聚合函數aggregate在UserCourseProgress中取數,參數是遵循mongodb規範的彙總表達式。計算結果是內存數據,以下:mongoose

        Picture 1

        A3: 用find函數從Course中取數,過濾條件爲空。Find的結果是遊標,因爲課程數量較少,所以用能夠fetch函數將遊標讀入內存,結果以下:分佈式

         Picture 4

         A4: 使用switch函數將A3中的外鍵切換爲A2中的記錄,結果以下:ide

         Picture 7

        A5:按對象方式訪問內存,造成新的二維表,結果以下:函數

        Picture 10

        A6:關閉mongodb鏈接。

        經過上面的例子能夠看到,藉助集算器SPL語言,在Mongodb中多個表的外鍵關聯查詢,徹底能夠作到像關係數據庫那樣方便、容易、直觀,沒必要擔憂由於Mongodb是非關係型數據庫而帶來的表間弱關聯的影響。

相關文章
相關標籤/搜索