带引用字段

时间:2018-03-23 09:44:32

标签: firebase google-cloud-firestore firebase-security

我有点卡在这里,因为无法调试这些规则。我非常感谢以下规则的帮助。

我想访问:

/modules/module-id/sessions/session-id/parts/

null第一部分与hasCompletedPrerequisiteSession()的比较效果很好,第二部分没有!

路径/modules/moduleId/sessions/sessionId/prerequisite指向参考字段。

service cloud.firestore {
    match /databases/{database}/documents {

      function hasCompletedPrerequisiteSession(moduleId,sessionId) {
                // this part works well                                   
        return getPrerequisiteSession(moduleId,sessionId) == null ||
           // !!! this part does not work !!!
           hasCompleted(getPrerequisiteSession(moduleId,sessionId).id);
      }

      function getPrerequisiteSession(moduleId,sessionId) {
        return get(/databases/$(database)/documents/modules/$(moduleId)/sessions/$(sessionId)).data.prerequisite;
      }

      function hasCompleted(sessionId) {
        return exists(/databases/$(database)/documents/progress/$(request.auth.uid)/sessions/$(sessionId));
      }

      match /modules/{moduleId}/sessions/{sessionId}/parts/{partId} {
        allow read: if hasCompletedPrerequisiteSession(moduleId,sessionId);
      }
    }
  }

enter image description here

(如果我将会话ID存储为字符串而不是对会话的引用,它可以正常工作。)

修改

问题

  1. 安全规则中的参考字段。假设modules/moduleId/owner指向reference类型的字段。获取引用文档的ID的正确方法是什么?get(../modules/moduleId).data.owner.data.idget(../modules/moduleId).data.owner或其他什么?

1 个答案:

答案 0 :(得分:3)

从Firebase支持:

在您的用例中,您似乎想从参考字段的值中获取文档名称(sessionId)(前提条件),很遗憾, Firestore安全规则目前不支持此操作 。我建议您仅将sessionId作为String存储在prerequisite字段中,或者也可以为sessionId添加String字段。请记住,exist()和get()函数仅允许您检查文档是否存在,或在给定路径下检索文档。