首页 > 解决方案 > Firestore 规则仅添加/删除一项数组

问题描述

为了优化使用,我有一个只有一个文档的 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});

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


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

这是一个检查是否仅删除了 1 个项目的示例:

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;
}

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


推荐阅读