Mongoose基于MongoDB建模并設(shè)置關(guān)聯(lián)

一形庭、模型關(guān)聯(lián)

1坤邪、一對(duì)多/多對(duì)多

在一中關(guān)聯(lián)多中的字段灸撰,type為mongoose.Schema.Types.ObjectId,并關(guān)聯(lián)關(guān)聯(lián)模型的名稱(chēng)挪捕。

const categorySchema = new mongoose.Schema({
  name: {type: String}
})

const tagSchema = new mongoose.Schema({
  name: {type: String}
})

const articleSchema = new mongoose.Schema({
  title: {type: String},
  content: {type: String},
  /* 一對(duì)多字段為一個(gè)對(duì)象 */
  category: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Category'   // 關(guān)聯(lián)的模型
  },
  /* 多對(duì)多字段為一個(gè)數(shù)組 */
  tags: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Tag' 
  }]
})

2粗梭、關(guān)聯(lián)模型的查詢(xún)

(1)一對(duì)多查詢(xún)

從關(guān)聯(lián)對(duì)象中查詢(xún)

const category = await Article.find().populate('category')
console.log(category)

結(jié)果為一個(gè)數(shù)組,數(shù)組中的對(duì)象含有category對(duì)象

[ { tags: [ 5ced005cf0b6b50fe429ffdb, 5ced005df0b6b50fe429ffdc ],
    _id: 5cecff6c9d129a1520c4fa9c,
    title: 'article1',
    content: 'article1',
    __v: 1,
    category: { _id: 5ced0007037e041ec0560c1a, name: 'node', __v: 0 } },
  { tags: [ 5ced005df0b6b50fe429ffdc ],
    _id: 5cecff6d9d129a1520c4fa9d,
    title: 'article2',
    content: 'article2',
    __v: 1,
    category: { _id: 5ced0008037e041ec0560c1b, name: 'vue', __v: 0 } } ]

(2)多對(duì)多查詢(xún)

  const tag = await Article.find().populate('tags')
  console.log(tag)

結(jié)果為數(shù)組,被關(guān)聯(lián)對(duì)象字段也是一個(gè)數(shù)組级零,包含多個(gè)對(duì)象

[ { tags: [ [Object], [Object] ],
    _id: 5cecff6c9d129a1520c4fa9c,
    title: 'article1',
    content: 'article1',
    __v: 1,
    category: 5ced0007037e041ec0560c1a },
  { tags: [ [Object] ],
    _id: 5cecff6d9d129a1520c4fa9d,
    title: 'article2',
    content: 'article2',
    __v: 1,
    category: 5ced0008037e041ec0560c1b } ]

3断医、從被關(guān)聯(lián)模型中查詢(xún)關(guān)聯(lián)模型

(1)設(shè)置虛擬字段

在被關(guān)聯(lián)模型中設(shè)置虛擬字段

categorySchema.virtual('articles', {  // 定義虛擬字段
  ref: 'Article',                                       // 關(guān)聯(lián)的模型
  localField: '_id',                                // 內(nèi)鍵,Category模型的id字段
  foreignField: 'category',                     // 外鍵妄讯,關(guān)聯(lián)模型的category字段
  justOne: false                                        // 只查詢(xún)一條數(shù)據(jù)
})

const tagSchema = new mongoose.Schema({
  name: {type: String}
})
tagSchema.virtual('articles', {
  ref: 'Article',
  localField: '_id',
  foreignField: 'tags',
  justOne: false
})

(2)查詢(xún)

const article = await Tag.find().populate('articles')
console.log(article)

結(jié)果表面上看起來(lái)沒(méi)有其他字段的信息孩锡,但虛擬字段的內(nèi)容已經(jīng)包括在內(nèi)了;

[ { _id: 5ced005cf0b6b50fe429ffdb, name: 'tag1', __v: 0 },
  { _id: 5ced005df0b6b50fe429ffdc, name: 'tag2', __v: 0 } ]

繼續(xù)在結(jié)果的數(shù)組中選擇一個(gè)對(duì)象,并查詢(xún)articles字段亥贸;

const article = await Tag.find().populate('articles')
console.log(article[0].articles)

結(jié)果就會(huì)為tag為tag1的所有文章。

[ { tags: [ 5ced005cf0b6b50fe429ffdb, 5ced005df0b6b50fe429ffdc ],
    _id: 5cecff6c9d129a1520c4fa9c,
    title: 'article1',
    content: 'article1',
    __v: 1,
    category: 5ced0007037e041ec0560c1a } ]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浇垦,一起剝皮案震驚了整個(gè)濱河市炕置,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男韧,老刑警劉巖朴摊,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異此虑,居然都是意外死亡甚纲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)朦前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)介杆,“玉大人,你說(shuō)我怎么就攤上這事韭寸〈荷冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恩伺,是天一觀的道長(zhǎng)赴背。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晶渠,這世上最難降的妖魔是什么凰荚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮褒脯,結(jié)果婚禮上便瑟,老公的妹妹穿的比我還像新娘。我一直安慰自己憨颠,他們只是感情好胳徽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布积锅。 她就那樣靜靜地躺著,像睡著了一般养盗。 火紅的嫁衣襯著肌膚如雪缚陷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天往核,我揣著相機(jī)與錄音箫爷,去河邊找鬼。 笑死聂儒,一個(gè)胖子當(dāng)著我的面吹牛虎锚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衩婚,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窜护,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了非春?” 一聲冷哼從身側(cè)響起柱徙,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奇昙,沒(méi)想到半個(gè)月后护侮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡储耐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年羊初,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什湘。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡长赞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禽炬,到底是詐尸還是另有隱情涧卵,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布腹尖,位于F島的核電站柳恐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏热幔。R本人自食惡果不足惜乐设,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绎巨。 院中可真熱鬧近尚,春花似錦、人聲如沸场勤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至格遭,卻和暖如春哈街,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拒迅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工骚秦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧微。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓作箍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親前硫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胞得,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵勝奧閱讀 4,783評(píng)論 0 1
  • REST API 可以讓你用任何支持發(fā)送 HTTP 請(qǐng)求的設(shè)備來(lái)與 Parse 進(jìn)行交互,你可以使用 REST A...
    Caroline嗯哼閱讀 2,002評(píng)論 0 0
  • mongoose介紹及基本使用 標(biāo)簽(空格分隔): 未分類(lèi) 兩種和數(shù)據(jù)庫(kù)交互的方式 使用原生語(yǔ)言查詢(xún) eg:sel...
    debt閱讀 2,160評(píng)論 0 2
  • 初學(xué)Node.js接觸到MongoDB數(shù)據(jù)庫(kù)开瞭,閱讀資料中推薦的都是Mongoose模塊懒震,可以更加方便的對(duì)數(shù)據(jù)庫(kù)進(jìn)行...
    LnEoi閱讀 31,416評(píng)論 9 49
  • 11月22號(hào)葱色,廣州開(kāi)始了中心區(qū)18塊土地拍賣(mài)∧锵悖“白云新城”某地盤(pán)的樓面價(jià)已高達(dá)46958元/平方米苍狰,而周邊一手住宅...
    八豆說(shuō)財(cái)閱讀 688評(píng)論 0 0