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
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))
);
}
}
}