我有这样的文档结构:
Courses/[courseId] {
name: string,
description: string
// this is a subcollection
members/{userId} {
user: [userId],
role: 'trainer',
}
}
现在我想只允许课程的成员读取课程数据。我正在编写这样的规则:
match /databases/{database}/documents {
match /courses/{course} {
allow read: if exists(/databases/$(database)/documents/courses/$(course)/members/$(request.auth.uid));
match /members/{member} {
allow read, write: if resource.data.userId == request.auth.uid;
allow create;
}
}
}
它不起作用,给我一个错误:Null value error. for 'list'
更新:错误来自这一行:
exists(/databases/$(database)/documents/courses/$(course)/members/$(request.auth.uid)
特别是$(course)
。如果我用实际的课程 ID 替换 $(course)
,错误就会消失。但我需要它是动态的。
我应该改变数据的结构吗?如果是这样,推荐的结构方式是什么?
以前,我有一个包含 members
和 courseId
的根集合 userId
,就像一个 n-n 关系表。但是,由于 Firestore 规则没有 query
函数,因此我无法根据根 members
集合控制课程的访问权限。