《mongodb 實現(xiàn)連接查詢》要點:
本文介紹了mongodb 實現(xiàn)連接查詢,希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:非關(guān)系型數(shù)據(jù)庫
今天我們學習下DBRef的使用,用過mongodb的都知道m(xù)ongodb不能做關(guān)聯(lián)查詢,關(guān)系型數(shù)據(jù)庫中是可以的,當然我們不要用關(guān)系型數(shù)據(jù)庫的思想來用nosql.
但是實際應用中也是會有類似的需求的.
我們就以學生和班級的關(guān)系來講解一對一以及一對多的關(guān)聯(lián)操作.
一個班級有多個學生,班級對學生是一對多的關(guān)系
一個學生屬于一個班級,學生對班級是一對一的關(guān)系
如果用mysql那么就是下面2張表: 班級表: classId className 學生表: studentId studentName classId
查詢學生信息帶出班級信息的查詢也方便
用mongodb要如何設(shè)計集合呢???
班級集合中嵌套學生信息:
上面的嵌套在學生數(shù)量有限的情況下是可以的,如果量大超過16M的時候就不適用了,學生有很多信息,我這邊只列了簡單的.
為了減少文檔的大小,那么能不能像mysql一樣,之存儲id然后做關(guān)聯(lián)呢?
在mongodb中可以使用DBRef來關(guān)聯(lián)
定義要用到的實體類
保存數(shù)據(jù)的時候先保存班級數(shù)據(jù),班級有了學生對象中的班級才能引用到,因為引用是通過_id來的.
我們可以看到保存后的數(shù)據(jù)在學生集合中有DBRef引用class中的57fa4b99d4c68bb7d044d616
然后我們查詢這個學生的信息就可以自動帶出班級的信息了,用過hibernate的一看就知道哈..
上面將的是一對一的操作,一對多的話就比較麻煩了
我們看上面這段代碼,大家覺得這段代碼能執(zhí)行成功嗎?不能...
上面也說了,引用一定要引用已經(jīng)插入到數(shù)據(jù)的數(shù)據(jù).
這邊先保存學生信息,學生中引用了班級,班級還沒保存
先保存班級信息的話,班級中引用了學生,學生此時還沒保存
如果引用沒保存的信息就會報錯
這樣不行,我們就只能曲線救國了
從業(yè)務上來說首先肯定是開班級,班級有了再招生
我們就利用上面已經(jīng)存在的五年級一班來添加學生
在李學生加入班級后,馬上把班級集合中的學生List對象改掉,這樣班級中也就存在了對這個學生的引用信息, 這樣就會比較麻煩.
我們在查詢班級的時候就可以關(guān)聯(lián)出這個班級下所有的學生信息了
搞個一對多這么麻煩,還不如不弄呢,,不要急,條條大路通羅馬,這條路不通,還有別的路啊.
我們的需求無非就是想知道某個班級下有多少個學生嗎?如果不用關(guān)聯(lián)的話就自己查唄,查的話我們沒在學生集合中單獨存儲班級的id啊,引用里不是有id嗎,就用那個查,但是要注意語法classObj.$id
源碼地址:https://github.com/yinjihuan/cxytiandi
歡迎參與《mongodb 實現(xiàn)連接查詢》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/10200.html