微信小程序多表聯(lián)合查詢的實(shí)現(xiàn)詳解
一對(duì)一的設(shè)計(jì)一般不常見(jiàn),只需要設(shè)計(jì)到主表中即可,避免增加復(fù)雜性。一對(duì)多的關(guān)系比較常見(jiàn),一的一方通常作為主表,多的一方通常作為子表。而多對(duì)多一般會(huì)拆分成兩個(gè)一對(duì)多的關(guān)系,這就必須要用中間表進(jìn)行過(guò)渡。
我們本篇介紹的多表查詢,側(cè)重在一對(duì)多的關(guān)系,我們先看一下我們實(shí)際的表設(shè)計(jì)
一對(duì)多表設(shè)計(jì)
我們實(shí)現(xiàn)的是文章關(guān)注的業(yè)務(wù),通常將文章作為主表,而關(guān)注信息作為子表。表和表之間要進(jìn)行關(guān)聯(lián),常見(jiàn)的設(shè)計(jì)思路是子表的外鍵和主表的主鍵進(jìn)行關(guān)聯(lián)
這里的文章表的主鍵是_id,所謂的主鍵就是可以唯一標(biāo)識(shí)該條數(shù)據(jù),數(shù)據(jù)不允許重復(fù)。關(guān)注表的articleid作為關(guān)注表的外鍵,外鍵可以重復(fù),存儲(chǔ)的是主表的主鍵。
SQL中的關(guān)聯(lián)查詢
在sql中可以對(duì)表進(jìn)行關(guān)聯(lián)查詢,我們使用select 語(yǔ)句來(lái)進(jìn)行關(guān)聯(lián),關(guān)聯(lián)的語(yǔ)句為
select * from article a , focus f where a._id = f.articleid
兩個(gè)表進(jìn)行關(guān)聯(lián)之后其實(shí)是對(duì)表進(jìn)行了合并,將文章表的字段和關(guān)注表的字段合并成一個(gè)表,關(guān)聯(lián)的條件是文章表的數(shù)據(jù)標(biāo)識(shí)和關(guān)注表的articleid做等值連接
低碼中的表關(guān)聯(lián)
低碼中的表設(shè)計(jì)也遵循數(shù)據(jù)庫(kù)的表設(shè)計(jì),不同的是,低碼中的外鍵不需要自己?jiǎn)为?dú)設(shè)計(jì),可以設(shè)置成關(guān)聯(lián)關(guān)系即可,比如文章表的字段
一般我們的數(shù)據(jù)標(biāo)識(shí)就是我們表的主鍵,關(guān)注表可以存儲(chǔ)外鍵
我們這里的articleid的數(shù)據(jù)類型設(shè)置成關(guān)聯(lián)關(guān)系其實(shí)就是一種外鍵的意思。
自定義連接器中實(shí)現(xiàn)表關(guān)聯(lián)查詢
要想在低碼中實(shí)現(xiàn)表和表之間的關(guān)聯(lián)查詢,需要使用aggregate聚合的語(yǔ)法,聚合語(yǔ)法也有本表和需要連接的表,官方文檔里使用了lookup進(jìn)行表關(guān)聯(lián)
lookup({
from: <要連接的集合名>,
localField: <輸入記錄的要進(jìn)行相等匹配的字段>,
foreignField: <被連接集合的要進(jìn)行相等匹配的字段>,
as: <輸出的數(shù)組字段名>
})
具體的參數(shù)說(shuō)明
參數(shù)字段 | 說(shuō)明 |
---|---|
from | 要進(jìn)行連接的另外一個(gè)集合的名字 |
localField | 當(dāng)前流水線的輸入記錄的字段名,該字段將被用于與 from 指定的集合的 foreignField 進(jìn)行相等匹配。如果輸入記錄中沒(méi)有該字段,則該字段的值在匹配時(shí)會(huì)被視作 null |
foreignField | 被連接集合的字段名,該字段會(huì)被用于與 localField 進(jìn)行相等匹配。如果被連接集合的記錄中沒(méi)有該字段,該字段的值將在匹配時(shí)被視作 null |
as | 指定連接匹配出的記錄列表要存放的字段名,這個(gè)數(shù)組包含的是匹配出的來(lái)自 from 集合的記錄。如果輸入記錄中本來(lái)就已有該字段,則該字段會(huì)被覆寫(xiě) |
光看文檔解釋可能還不是特別明白,我們需要具體實(shí)踐一下
新建連接器
登錄控制臺(tái),點(diǎn)擊自定義連接器,點(diǎn)擊新建自定義連接器
輸入名稱和標(biāo)識(shí)
點(diǎn)擊添加方法,新增關(guān)聯(lián)查詢的方法
在自定義代碼編輯器里輸入如下代碼
module.exports = async function (params, context) { const result = await context.database.collection('lcap-data-2cc504BEZ-gz_necsx6t-preview').aggregate() .match({ openid:params.openid }) .lookup({ from: 'lcap-data-2cc4oRuu1-wz_hbmrxec-preview', localField: 'articleid', foreignField: '_id', as: 'articles', }) .end() // 在這里返回這個(gè)方法的結(jié)果,需要與出參定義的結(jié)構(gòu)映射 return result.data; };
為了讓代碼運(yùn)行,先需要新建入?yún)?/p>
入?yún)⒔ê弥?,在代碼里對(duì)應(yīng)的match字段,其中左邊是字段標(biāo)識(shí),右邊可以通過(guò)params.openid來(lái)獲取到入?yún)?/p>
集合的名稱需要在云開(kāi)發(fā)cloudbase的數(shù)據(jù)庫(kù)里找
這些都準(zhǔn)備好了就要對(duì)好localField和foreignField,我們這里的localField是關(guān)注表里存儲(chǔ)的文章id,而foreignField是文章表的數(shù)據(jù)標(biāo)識(shí)
入?yún)⒔ê弥笮枰c(diǎn)擊方法測(cè)試
測(cè)試成功之后就可以點(diǎn)擊出參映射,這樣一個(gè)方法就做好了。這里有必要說(shuō)一下返回的結(jié)果
[
{
"_id": "16db756f62e7386d0cfdef132edd5e8a",
"owner": "1448239235785420802",
"createdAt": 1659320429844,
"createBy": "1448239235785420802",
"wzbs": "111",
"updateBy": "1448239235785420802",
"openid": "1111",
"articleid": "ca780ad562c290d509bd361d555705c3",
"updatedAt": 1659320429844,
"articles": [
{
"_id": "ca780ad562c290d509bd361d555705c3",
"owner": "1448239235785420802",
"createdAt": 1656918229822,
"bt": "最新文章一",
"createBy": "1448239235785420802",
"nr": "<p><span style=\"color:#222222\"><span style=\"font-size:18px\"><span style=\"background-color:#ffffff\">如果你是已經(jīng)落實(shí)工作單位的畢業(yè)生,請(qǐng)及時(shí)與用人單位簽訂勞動(dòng)合同,跟進(jìn)繳納社會(huì)保險(xiǎn),確認(rèn)檔案轉(zhuǎn)遞去向,并在規(guī)定時(shí)間內(nèi)辦理戶口遷移、黨團(tuán)組織關(guān)系接轉(zhuǎn)等手續(xù)。你入職的企業(yè),也可以申請(qǐng)社會(huì)保險(xiǎn)補(bǔ)貼、吸納就業(yè)補(bǔ)貼以及擴(kuò)崗補(bǔ)助等政策支持。</span></span></span></p>",
"fbrq": 1656864000000,
"updateBy": "1448239235785420802",
"updatedAt": 1656918229822
}
]
}
]
返回的是一個(gè)數(shù)組,數(shù)組里包含一個(gè)對(duì)象,對(duì)象的基本屬性是顯示的關(guān)注表的字段,而articles是具體用戶關(guān)注的文章的集合,在做展示的時(shí)候其實(shí)是要綁定articles才對(duì)
總結(jié)
要想實(shí)現(xiàn)多表之間的關(guān)聯(lián)查詢,先需要做數(shù)據(jù)庫(kù)設(shè)計(jì),然后按照文檔的聚合語(yǔ)法編寫(xiě)自定義連接器實(shí)現(xiàn),具體還需要結(jié)合你自己的業(yè)務(wù)才可以。
到此這篇關(guān)于微信小程序多表聯(lián)合查詢的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)小程序多表聯(lián)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用控制臺(tái)破解百小度一個(gè)月只準(zhǔn)改一次名字
這篇文章主要介紹了使用控制臺(tái)破解百小度一個(gè)月只準(zhǔn)改一次名字的方法和代碼,有需要的小伙伴可以參考下。2015-08-08如何用JavaScript實(shí)現(xiàn)一個(gè)數(shù)組惰性求值庫(kù)
這篇文章主要介紹了如何用JavaScript實(shí)現(xiàn)一個(gè)數(shù)組惰性求值庫(kù),對(duì)惰性求值感興趣的同學(xué),可以參考下2021-05-05node.js使用nodemailer發(fā)送郵件實(shí)例
這篇文章主要介紹了node.js使用nodemailer發(fā)送郵件的方法,例子中使用的是QQ郵箱,你也可以修改成其它的郵箱如163、gmail等,需要的朋友可以參考下2014-03-03JS數(shù)組索引檢測(cè)中的數(shù)據(jù)類型問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于JS數(shù)組索引檢測(cè)中的數(shù)據(jù)類型問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換
javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換2009-07-07javascript 拽拉效果 供JS初學(xué)者學(xué)習(xí)參考
超精簡(jiǎn)的拽拉效果JS,并且還是同時(shí)支持IE和FF。 可以給與其他剛開(kāi)始學(xué)習(xí)JS的朋友作為參考和學(xué)習(xí)。2008-07-07Aptos?SDK交互實(shí)現(xiàn)過(guò)程詳解
這篇文章主要為大家介紹了Aptos?SDK交互實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03