我试图编写一个规则,如果文档的 id 不存在,则创建一个新文档。我的目标是:
Message message = new Message(userId, title, messageBody, timestamp);
我正在使用WriteBatch
创建一个新文档并更新该文档:
mWriteBatch.set(mMessageRef.document(messageId), message);
mWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);
浏览完文档和这个网站后,我发现如果我使用create
方法,仅如果数据不存在则允许写入.
所以我创建了一个安全规则,例如:
match /messages/{message} {
allow read;
allow create: if isSignedIn();
allow update, delete: if isSignedIn();
}
isSignedIn()
只是一个包含的方法request.auth != null
。此规则失败并覆盖数据。现在我尝试了:
match /messages/{message} {
allow read;
allow create: if request.resource.id != message;
allow update, delete: if isSignedIn();
}
这次它也覆盖了数据而不是显示错误。
我在这里做错了什么?任何帮助表示赞赏。
Update:正如何塞·大卫·阿罗斯蒂 (José David Aroesti) 在《comments,我必须将其更改为exists
并删除update
and delete
才能正常工作,并且从应用程序中它反映了它应该做的事情。但那我该怎么办update
and delete
一个文件?
例如,当我在模拟器中使用以下规则时,两者都按预期执行,但是当我从设备测试它时,我总是能够创建一个文档,即使它存在:
allow create: if !exists(/databases/$(database)/documents/messages/$(message));
allow update: if get(/databases/$(database)/documents/messages/$(message)).data.timestamp
< request.resource.data.timestamp;
是否可以?