我想實作以下約束:
- 用戶可以保存電影(標題),也可以查看其他用戶上傳的標題。
- 所有用戶都必須能夠訪問所有電影,但只能編輯/添加/洗掉自己的電影。
- 用戶不應該以任何方式查看添加了電影的人,除非那個人是他們。(我想讓他們甚至無法查看“X”和“Y”電影是否來自同一用戶)
- 用戶最多可以添加 3 部電影(這個數字是客戶要求的,但如果他們改變主意,如何使其可擴展?)
我讓用戶使用 firebase 身份驗證登錄,從而獲得用戶 uid。我想盡可能使用 Firestore 規則,在寫這個問題時我不知道的任何其他技術上對 Firestore 服務器端進行大多數約束/檢查。
我想到了以下結構:
movies: {
userUid1: {
movie1:{
name: "dummy name 1"
},
movie2:{
name: "dummy name 2"
}
},
userUid2: {
movie1:{
name: "first dummy name"
},
movie2:{
name: "second dummy name"
},
movie3:{
name: "third dummy name"
}
}
}
要么:
movies: {
movieUid1: {
name: "dummy name 1",
userId: "userUid1"
},
movieUid2: {
name: "dummy name 2",
userId: "userUid1"
},
movieUid3: {
name: "dummy name 3",
userId: "userUid2"
},
movieUid4: {
name: "dummy name 4",
userId: "userUid2"
},
movieUid5: {
name: "dummy name 5",
userId: "userUid2"
}
}
這個專案只針對一些朋友,所以沒什么大不了的,但我仍然想盡可能地構建最好的方式。我認為這無關緊要,但我使用顫振來創建應用程式。
uj5u.com熱心網友回復:
如果您需要跟蹤用戶保存的電影數量(或稍后存盤任何用戶相關資訊),您可以嘗試以下結構:
users -> { userId } -> movies -> { movieId }
(col) (doc) (col) (doc)
任何與用戶相關的用戶資訊都可以存盤在用戶的檔案和他們的電影中的子集合中。
用戶可以保存電影(標題),也可以查看其他用戶上傳的標題。
然后,您可以使用Collection Group查詢列出所有電影。
所有用戶都必須能夠訪問所有電影,但只能編輯/添加/洗掉自己的電影。
您可以為此使用安全規則。這些規則應該有效:
match /users/{userId}/movies/{movieId} {
// Only authenticated users can read
allow read: if request.auth != null;
// Only the user who added movie can write/delete
allow write: if request.auth != null && request.auth.uid == resource.data.author;
}
您需要將用戶的 UID 存盤在電影檔案中才能使上述規則生效。您可以使用get()從用戶檔案中讀取資料。
用戶最多可以添加 3 部電影
您可以添加一條規則,從用戶的檔案中讀取用戶添加的電影數量,如果該值為 3,則拒絕創建。
您可以查看此答案以閱讀有關根級別集合和子集合的更多資訊:
在 Firestore 中使用子集合有什么好處嗎?
uj5u.com熱心網友回復:
一般來說,我認為典型的方法是兩者都做。Firestore 在諸如“向我顯示帶有用戶 ID xyz 的電影集合中的所有電影”或“找到隱藏在我不認識的某個用戶下的電影記錄 xyz”之類的查詢時做得不好。
因此,通常情況下,如果您需要查找特定電影,以及獲取一個用戶的所有電影串列,您將以兩種方式存盤資料,然后使用觸發器(在本例中為 Firebase 函式)使它們保持同步.
這篇文章的答案(什么是 Firebase Cloud Firestore 中的非規范化?)有一個很好的解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/430098.html
