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