Firebase(firestore)规则:确保仅在另一个文档更新时更新(FieldValue增加)?

Firebase(firestore)规则:确保仅在另一个文档更新时更新(FieldValue增加)?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我试图在一个集合中创建一个stats文档,简而言之,我只想在同一个集合批写入中更新另一个文档时才允许更新它。是否有办法确保在此请求期间更新另一个文档 我之所以考虑在客户端使用它,是因为以下来源: 有没有更好的方法来清点文件?我不在乎它是否是对RESTAPI而不是通过SDK的实际调用 我正在验证是否根据在另一个doc private=>public,public=>private,created,deleted…,收到的请求数据正确地更新了统计数据,因为我显然知道统计数据文档的确切路径 但我不知道

我试图在一个集合中创建一个stats文档,简而言之,我只想在同一个集合批写入中更新另一个文档时才允许更新它。是否有办法确保在此请求期间更新另一个文档

我之所以考虑在客户端使用它,是因为以下来源:

有没有更好的方法来清点文件?我不在乎它是否是对RESTAPI而不是通过SDK的实际调用

我正在验证是否根据在另一个doc private=>public,public=>private,created,deleted…,收到的请求数据正确地更新了统计数据,因为我显然知道统计数据文档的确切路径

但我不知道如何确保只有当/如果另一个文档进行更新时,统计数据才能得到更新,除了显而易见的,我在其中传递该文档的ID

我的规则的简短版本是:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
    match /stories/---STATS--- {
      allow read;
      allow create, update;
    }

    match /stories/{storyId} {
      allow read: if isPublic() || isAuthor();
      allow create: if
        isSignedIn() &&
        updatedStats() &&
        validateCreate();

      function updatedStats() {
        return getAfterStats().updatedAt == request.time;
      }
      function validateCreate() {
        return
          ( // Created public
            new().public &&
            isIncreaseN() &&
            isIncreaseNAll()
          ) ||
          ( // Created private
            !new().public &&
            isUntouchedN() &&
            isIncreaseNAll()
          );
      }
      // COUNTERS
      function isStats() {
        return exists(/databases/$(database)/documents/stories/---STATS---);
      }
      function getStats() {
        return get(/databases/$(database)/documents/stories/---STATS---).data;
      }
      function getAfterStats() {
        return getAfter(/databases/$(database)/documents/stories/---STATS---).data;
      }
      // n
      function isIncreaseN() {
        return  (!isStats() && getAfterStats().n == 1) ||
                (!getStats().keys().hasAll(['n']) && getAfterStats().n == 1) ||
                (getStats().n +1 == getAfterStats().n);
      }
      function isUntouchedN() {
        return  (!isStats() && !getAfterStats().keys().hasAll(['n'])) ||
                (!getStats().keys().hasAll(['n']) && !getAfterStats().keys().hasAll(['n'])) ||
                (getStats().n == getAfterStats().n);
      }
      // nAll
      function isIncreaseNAll() {
        return  (!isStats() && getAfterStats().nAll == 1) ||
                (!getStats().hasAll(['nAll']) && getAfterStats().nAll == 1) ||
                (getStats().nAll +1 == getAfterStats().nAll);
      }
  }
}

// GETTERS
function new() {
  return request.resource.data;
}
function cur() {
  return resource.data;
}
function auth() {
  return request.auth;
}

// MISC
function isSingedIn() {
  return auth() != null;
}

我还有一些关于统计文件的验证规则,比如只允许某些字段存在,只允许增量/减量为1,等等,但实际上没有什么可以阻止在不涉及任何实际故事的情况下增加此值。

在Firebase安全规则中,不可能知道集合中的某个任意文档是否与另一个文档一起发生了更改。您必须知道批写入中所有文档的完整路径,以便能够查看它们是否都一致地更改。

然后我想我还必须传递ID。我会再等几天,以防出现其他答案,然后接受它作为最终答案。谢谢你的快速回复。