firebase - 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});
解决方案
您可以使用与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;
}
然后您可以检查是否只添加了一项。如果您的文档中不存在该数组,您还应该添加额外的检查。
推荐阅读
- tomcat - Apache Tomcat 9 重写阀不起作用
- java - 媒体播放器音频,在 Tick 方法的倒数计时器中,10 秒后静音
- javascript - 使用 BDD 时 Expect() 不进行比较
- python-3.x - 给定每对单词的相似度,如何衡量两个文档的相似度?
- teradata - 在 Teradata SQL 中使用 for 循环
- gif - 只加载和播放可见的 GIF,暂停不再可见的:有可能吗?
- c# - 在 C++ 中在运行时加载 tlb
- javascript - 如何使用JS仅在字符串中间按空格分割字符串
- node.js - 如何向所有非活动玩家 webhook facebook messenger 发送 bot 消息
- git - 我已经提交了我应该忽略的文件夹。我怎么能现在开始忽略?