天天看點

《MongoDB管理與開發精要》——3.3節聯合查詢

3.3 聯合查詢

通過連接配接運算符可以實作多個表聯合查詢。連接配接是關系型資料庫模型的主要特點,也是它差別于其他類型資料庫管理系統的一個标志。

在關系型資料庫管理系統中,表建立時各資料之間的關系不必确定,常把一個實體的所有資訊存放在一個表中。當檢索資料時,通過連接配接操作查詢出存放在多個表中的不同實體的資訊。連接配接操作的靈活性給使用者帶來很大的友善,它們可以在任何時候增加新的資料類型、為不同實體建立新的表,而後通過連接配接進行查詢。

其實由于mongodb本身的特點,不建議用多collection關聯處理,但有些需求必須進行關聯處理,是以,我們可以用兩種方法去應付這類需求:簡單手工關聯和dbref方式關聯。

3.3.1 簡單手工關聯

本小節模拟使用者在論壇上檢視文章清單的場景,圖3-1是文章和使用者這兩個collection的er圖。

《MongoDB管理與開發精要》——3.3節聯合查詢

擴充閱讀 er圖

er圖(entity-relation diagram,實體聯系圖)用來建立資料模型,在資料庫系統概論中屬于概念設計階段,形成一個獨立于機器,獨立于dbms的er圖模型。 通常将它簡稱為er圖,相應地可把用er圖描繪的資料模型稱為er模型。er圖提供了表示實體(即資料對象)、屬性和聯系的方法,用來描述現實世界的概念模型。

下面示範如何通過使用者名獲得該使用者發表過的文章。

步驟1 取得使用者對象“u”, 如下面的代碼所示:

上例使用了一個for循環就一次性地将某使用者的文章标題都列出來了。本例中其實兩張表并沒有顯式地定義過任何關系,在下面的例子中将看到另外一種聯合查詢的方法。

3.3.2 dbref方式關聯

dbref就是在兩個collection之間定義的一個關聯,比如,把collectionb“_id”列的值存在collectiona的一個列中,然後通過collectiona這個列中所存的值在collectionb中找到相應的記錄。

我們模拟一個使用者發文章的流程,看一看如何将文章表和使用者表建立關聯的。

步驟1 取得目前使用者資訊, 如下面的代碼所示:

從上面的例子可以看出,dbref就是從文檔的一個屬性指向另一個文檔的指針。