How do you force a Firestore client app to maintain a correct document count for a collection?

前端 未结 2 1708
梦毁少年i
梦毁少年i 2020-11-30 13:44

Firestore doesn\'t have a way to query for the size of a collection, so if a client app needs to know this value, it requires some maintenance of a document in another colle

2条回答
  •  暖寄归人
    2020-11-30 14:08

    The suggested solution would still fail, as you could just add additional documents to the batch write.

    But you could just add the following to the message collection rule:

    && get(/databases/$(database)/documents/messages-stats/data).data.messageId == request.resource.id;

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
    
        match /messages/{id} {
          allow read;
          allow create: if
            getAfter(/databases/$(database)/documents/messages-stats/data).data.count ==
                 get(/databases/$(database)/documents/messages-stats/data).data.count + 1 
                 && get(/databases/$(database)/documents/messages-stats/data).data.messageId == request.resource.id;
          allow delete: if
            getAfter(/databases/$(database)/documents/messages-stats/data).data.count ==
                 get(/databases/$(database)/documents/messages-stats/data).data.count - 1
                 && get(/databases/$(database)/documents/messages-stats/data).data.messageId == request.resource.id;
        }
    
        match /messages-stats/data {
          allow read;
          allow update: if (
            request.resource.data.count == resource.data.count + 1 &&
            existsAfter(/databases/$(database)/documents/messages/$(request.resource.data.messageId)) &&
               ! exists(/databases/$(database)/documents/messages/$(request.resource.data.messageId))
          ) || (
            request.resource.data.count == resource.data.count - 1 &&
            ! existsAfter(/databases/$(database)/documents/messages/$(request.resource.data.messageId)) &&
                   exists(/databases/$(database)/documents/messages/$(request.resource.data.messageId))
          );
        }
    
      }
    }
    

提交回复
热议问题