打開MongoDB Atlas,我們來到Project的Overview點擊【CONNECT】,在新出現的視窗選擇【MongoDB for VS Code】,找到第三步【mongodb+】開頭的區塊複製起來,記得把替換成Create User時的密碼。
我們來到.env檔案進行修改,username和password和伺服器網址請根據自己的設定做修改。
DATABASE_URL="mongodb+srv://username:password@cluster0.fzdzygu.mongodb.net/x"
我們先進行測試,看一下我們能不能把prisma設定的內容傳到MongoDB Atlas,修改schema.prisma。
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
model Test {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
}
在終端機輸入:
npx prisma db push
成功的情況下不會出現紅字,可以刪除用來測試的Test資料。
接下來我們開始建立資料模型,首先從User開始。
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String?
username String? @unique
bio String?
email String? @unique
bannerImage String?
avatarImage String?
hashedPassword String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
followingIds String[] @db.ObjectId
hasNotification Boolean?
posts Post[]
comments Comment[]
notifications Notification[]
}
這段程式定義了名為User的prisma模型如何對應到MongoDB的資料欄位。
舉例來說:name String?代表建立一個名字是name的欄位,資料形態可能是String或null或undefined。
我們介紹一下這些欄位的作用。
id:這是User的ID
name:User的姓名
username:用戶名
bio:X個人檔案的自我介紹
email:User的電子信箱
bannerImage:儲存X個人檔案的橫幅圖片
avatarImage:儲存X大頭照的圖片
hashedPassword:加密後的密碼,不使用明文儲存,即使駭客入侵資料庫也不能得到真正的密碼。
createdAt:User創建帳號的時間
updatedAt:User修改資料的時間
followingIds:X追隨的用戶列表
hasNotification:是否有通知
posts:對應到Post的prisma模型,用戶發佈的文章
comments:對應到Comment的prisma模型,用戶發佈的評論
notifications:對應到Notification的prisma模型,用戶的通知
@開頭都是MongoDB相關的設定
@id:將這個欄位設定成主鍵
@default((auto()):預設值為資料庫自動產生的數值
@map("_id"):這個欄位會對應到MongoDB中的_id欄位
@db.ObjectId:告訴MongoDB將這個欄位的資料形態設定成ObjectId
@unique:這個欄位裏的值不能重複
@default(now()):預設值為當下的時間
@updatedAt:每次更新時自動更新時間
Post的資料模型
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String @db.ObjectId
likedIds String[] @db.ObjectId
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
comments Comment[]
}
content:文章的內容
createdAt:文章發表的時間
updatedAt:文章修改的時間
userId:文章作者的id
likesIds:按下喜歡的用戶id
user:定義作者與文章之間的一對多關聯,userId為外鍵對應到User的id欄位,當user被刪除時發表的post也會被刪除。
comments:文章下的評論
Comment的資料模型
model Comment {
id String @id @default(auto()) @map("_id") @db.ObjectId
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String @db.ObjectId
postId String @db.ObjectId
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
post Post @relation(fields: [postId], references: [id], onDelete: Cascade)
}
Notification的資料模型
model Notification {
id String @id @default(auto()) @map("_id") @db.ObjectId
content String
userId String @db.ObjectId
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
完成以上程式碼後,在終端機輸入:
npx prisma db push
登入MongoDB,在畫面上找到【Browse Collections】,可以看到Comment、Notification、Post、User已經建立好了。