【问题标题】:Firestore rule to only add/remove one item of arrayFirestore 规则仅添加/删除一项数组
【发布时间】:2021-10-21 11:10:32
【问题描述】:

为了优化使用,我有一个 Firestore 集合,它只有一个文档,由一个字段组成,它是一个字符串数组。

这就是集合中数据的样子。只有一个包含一个字段的文档,它是一个数组:

在客户端,应用程序只是检索整个 status 文档,随机选择一个,然后将整个数组发送回减去它选择的那个

var all = await metaRef.doc("status").get();
List tokens=all['all'];
var r=new Random();
int numar=r.nextInt(tokens.length);
var ales=tokens[numar];
tokens.removeAt(numar);
metaRef.doc("status").set({"all":tokens});

然后它尝试对字符串做一些事情,这可能会失败或成功。如果成功,则不再写入数据库,但如果失败,它会再次获取该数组,将字符串添加回来并推送它:

var all = await metaRef.doc("status").get();
List tokens=all['all'];
List<String> toate=(tokens.map((element) => element as String).toList());
toate.add(ales.toString());
metaRef.doc("status").set({"all":toate});

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    您可以使用与Set 对象关联的方法。

    这是一个检查是否只删除了一项的示例:

    allow update: if checkremoveonlyoneitem()
    
    function checkremoveonlyoneitem() {
      let set = resource.data.array.toSet();
      let setafter = request.resource.data.array.toSet();
      return set.size() == setafter.size() + 1
        && set.intersection(setafter).size() == 1;
    }
    

    然后您可以检查是否只添加了一项。如果您的文档中不存在该数组,您还应该添加额外的检查。

    【讨论】:

    • 感谢您。我稍后会实施并留下反馈
    • 所以它被拒绝了。函数中的任何代码是否取决于我对字段的命名?像应该将数组命名为array 吗?我应该实施其他任何自定义来完成这项工作吗?
    • 请展示 1) 您的客户端代码和 2) 一些示例数据的屏幕截图
    • 将两者都添加到顶部。谢谢。我应该提到的一件事是这适用于一般规则(允许读取,写入:如果为真)
    • 哪个更新失败了?第一个还是第二个?您可以在第 2 行之后和tokenstoate 就在最后一行之前打印到控制台tokens 吗?您还可以显示 Firestore 中的所有值吗?
    【解决方案2】:

    如果您不确定应用程序如何执行任务,即成功与否,那么我想在客户端代码中实现此逻辑是个好主意。如果操作成功(由于脱机条件或任何其他问题),您可以创建一个简单的条件块,从文档中删除该字段。您可以从following document 中找到有关如何操作的以下示例。像这样,只需一次写入,您就可以删除用户选择的字段,而无需更新整个文档。

    city_ref = db.collection(u'cities').document(u'BJ')
    city_ref.update({
        u'capital': firestore.DELETE_FIELD
    })snippets.py
    
    

    【讨论】:

    • 这会起作用,除非我需要在客户端尝试使用它时删除该字符串,以便其他人无法选择它。
    • 为此,您可以拥有实时工作的快照侦听器。您可以稍微更改上述逻辑并在有人从文档中选择字符串时删除该字符串。如果不成功,则可以使用 set 方法通过一次写入将其添加回来。
    • 如果以上评论对您有帮助,请告诉我?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2021-07-04
    • 1970-01-01
    • 2021-08-14
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多