【问题标题】:Prevent update if document already exists firestore batch如果文档已存在 firestore 批处理,则阻止更新
【发布时间】:2020-06-22 10:50:07
【问题描述】:

我有一个程序在 firestore 上对集合执行批量写入。

我只在集合中不存在 is 时才尝试编写文档,如果存在则跳过而不修改任何内容。

安全规则如下:

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

我错过了什么,或者做错了什么?

【问题讨论】:

  • 你在哪里运行这段代码?如果这是使用常规 JavaScript 客户端,则应该无法更新文档。如果它使用 Node.js Admin SDK 运行,它会以绕过安全规则的提升权限运行。
  • 我将 firebase-admin 添加到我的 Node.js 项目中。我没想到……谢谢

标签: javascript firebase google-cloud-firestore


【解决方案1】:

可以先检查文档是否存在,不存在时再写入

docRef.get().then(doc => {
    if (!doc.exists) {
        batch.set(docRef, {
            id: data.id,
            stamp: new Date(),
        });
    }
});

【讨论】:

  • 这不会增加很多开销吗?我将有一个包含 500 多个文档的列表。让每个文档执行检查会增加处理时间,还会增加对 firestore 的不必要读取操作?
【解决方案2】:

从您的 cmets 看来,您正在使用 Admin SDK 在 Node.js 环境中运行此代码。当您使用 Admin SDK 时,它会以提升的管理权限访问 Firebase,并绕过您指定的安全规则。

有了这些知识,您的行为似乎正在按预期工作。

【讨论】:

  • 感谢您删除 admin-sdk 并使用经过身份验证的用户现在应用安全规则。但是我遇到了一个全新的问题,如果在批处理中间触发规则,程序就会停止......如果发生这种情况,是否有办法继续批处理?
  • 关于新问题:这正是批处理操作的目的,即自动提交或中止的写入操作。如果你不想要那样,你应该只使用单独的写入。如果您并行执行这些操作,那也将比使用批处理更快:stackoverflow.com/questions/58897274/…
  • 是的,对不起,我太专注于寻找另一种方式。感谢第二个链接,我认为批处理更快。 ..会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2021-06-03
  • 2022-11-18
  • 2020-12-21
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多