swift - updateData FieldValue.arrayUnion([value]) 的 Firebase Cloud Firestore 安全规则 [swift]
问题描述
我在 Cloud Firestore 中有一个文档。
“事件”字段的结构如下:
{
"events" : [
"eventID-1": [
"value1",
"value2"
],
"eventID-2": [
"value2",
"value3"
],
"eventID-3": [
"value3",
"value4"
]
]
}
更新[迅速]:
self.db.collection("collection").document(document).updateData([
"events.eventID-1": FieldValue.arrayUnion([value2])
...
如何制定 Firebase Cloud Firestore 安全规则:
价值是独一无二的。即在写入时,检查数组eventID-1、eventID-2、eventID-3 ...中是否不存在该值。
检查(长度)记录的值
我刚刚弄清楚如何检查传入的数据,它是一张地图,我们只能得到一个值。
match /databases/{database}/documents {
match /collection/{documentID} {
allow write: if request.resource.data is map
&& request.writeFields.size() == 1
}
}
UPD:已处理:
- 检查查询中的字符串长度
allow write : if request.resource.data.events.values()[0].size() < 100
- 检查列表中的唯一性
allow write : if (request.resource.data.events.keys()[0] in resource.data.events.keys()) == false
但是我还没有想出如何解决我的问题((((帮助!!!
解决方案
这是一个尝试:
allow write: if request.writeFields.size() == 1
&& geteventarray_after().size() == geteventarray_before().size() + 1 // Making sure that the size increased so that is is unique
&& getnewelement().size() < 100 // Making sure the new element size is < 100
&& getnewelement() is string // Other valdiations...
function getsubstr(str, from, to) {
return str[from:to];
}
function geteventarrayname() {
return getsubstr(input, "events.".size(), request.writeFields[0].size());
}
function geteventarray(map) {
return map.get(["events", geteventarrayname()], [])
}
function geteventarray_after() {
return geteventarray(request.resource.data);
}
function geteventarray_before() {
return geteventarray(resource.data);
}
function getnewelement() {
return geteventarray_after()[geteventarray_after().size()-1]; // It is added at the end
}
编辑:这是未经测试的,但应该是一个好的开始
推荐阅读
- gcc - Cannot temporarily disable unknown-pragmas warning in GCC
- django - Is there a way to paginate through individual template elements?
- openssl - Confused about how to set up OpenSSL for UDK2018
- c# - 如何始终保留集合的 n 个元素?
- python-3.x - 在 Python3 中重新创建 JS 按位整数处理
- winapi - Windows 投影文件系统只读?
- python - Using an Airflow sensor to start a DAG run
- angular - 使用 Angular 7 和 `ng lint` 在 TypeScript 中自定义 TSLint 规则
- javascript - Webrtc how to set the video remote after receiver back an asnwer
- bash - Allowing a wget to run as part of a command line parameter