如果文档已存在Firestore批处理,请阻止更新

时间:2020-06-22 10:50:07

标签: javascript firebase google-cloud-firestore

我有一个程序在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(),
    },
);

我想念什么或做错了什么?

2 个答案:

答案 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,并绕过您指定的安全规则。

有了这些知识,看来您的行为正在按预期进行。