我有一个程序在firestore上执行批量写入集合。
仅在集合中不存在文档时,我才尝试编写文档;如果文档不存在,则不进行任何修改就跳过该文档。
安全规则如下:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /collection/{id} {
allow create,delete: if request.auth.uid != null;
}
}
}
在测试工具上进行测试时,它会按预期工作。仅允许我创建和删除此集合中的文档。但是,从程序运行时,如果批量写入已经存在,则可以修改文档字段(在这种情况下为时间戳)。
代码如下:
var batch = firestore.batch();
var docRef= firestore.collection("collection").doc(data.id);
batch.set(
docRef,{
id: data.id,
stamp: new Date(),
},
);
我想念什么或做错了什么?
答案 0 :(得分:2)
您可以先检查文档是否存在,然后再检查是否存在
docRef.get().then(doc => {
if (!doc.exists) {
batch.set(docRef, {
id: data.id,
stamp: new Date(),
});
}
});
答案 1 :(得分:1)
从您的评论看来,您似乎正在使用Admin SDK在Node.js环境中运行此代码。当您使用Admin SDK时,它会以提升的管理特权访问Firebase,并绕过您指定的安全规则。
有了这些知识,看来您的行为正在按预期进行。