Firestore具有DocumentReference类型,它是另一个Firestore文档的“指针”。使用firebase JavaScript客户端,您可以直接在引用上访问属性(例如文档“id”)。
例如,如果存在一个带有docRef
属性的文档,该文档是一个Firestore DocumentReference:
const retrievedDoc = await getFirestoreDocument();
console.log(retrievedDoc.docRef.id); // "jRmSeMYDMKiOPGsmkdaZ"
我正在尝试在Firestore规则中完成同样的事情。有一个名为
isOwner
的custom function。它在文档路径上使用Firestore规则 get
调用,然后尝试访问docRef.id
,就像上面的JavaScript客户端一样。get(/databases/$(database)/documents/path/to/$(id)).data.docRef.id
将文档ID的值与当前用户的ID进行比较。但是,当我使用模拟器并以实际代码对其进行测试时,它会失败。我觉得这应该可行,但事实并非如此。
起作用的是直接将id值而不是DocumentReference存储并使用为字符串(例如
get(/path/id).docId
)。是否可以在Firestore规则中访问DocumentReference的
id
值? 我在做错什么吗?我想避免在描述in this SO answer的规则内执行第二个文档
get
。这是该规则的每个触发器的第二个“读取”。而且我认为文档ID(这是我需要的)无论如何都不会在get
调用中可用。
最佳答案
根据文档:
get()
方法应该返回一个Resource对象,该对象应该包含.id
属性(以及.data
)。例如,要将
write
访问限制为书本文档的作者(通过用户uid标识作者文档)的经过身份验证的用户,您可以执行以下操作:service cloud.firestore {
match /databases/{database}/documents {
match /books/{document=**} {
allow write: if get(resource.data.authorReference).id == request.auth.uid;
}
}
}
但是,尝试时总是出现错误
property id is undefined on object
。.data
可以访问,所以我认为api中存在问题。
关于firebase - 依赖文档引用的Firestore访问规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747797/