在Firestore中,我有一个包含多个文档的集合,其结构类似于
users: [
1234: {
foo: 'bar'
}
]
在我们的应用程序的旧版本中(我们已修复,但仍有许多用户使用它),有一段代码正在执行
firestoreInstance.collection('users').doc(1234).set({});
因为一个旧的错误。
它覆盖了整个对象,所以它变成了
users: [
1234: {
}
]
我已尝试使用以下安全规则阻止此特定覆盖:
service cloud.firestore {
match /databases/{database}/documents {
function objectIsEmpty() {
return request.resource.data.size() == 0;
}
match /users/{userId=**} {
allow read;
allow write: if !objectIsNotEmpty();
}
}
}
但覆盖仍在发生。我尝试过同样的事情
allow write: if false;
并没有帮助。
根据Customize Cloud Firestore Security Rules:
Cloud Firestore中有三种写入操作:创建,更新和删除。这些对应于客户端库中的 set(),add(),update(),remove()和transaction()方法。为方便起见,写操作允许所有这些。
我想象不允许write
使用空对象(通过禁止使用request.resource.data.size() == 0
写入)不允许set({})
代码被执行。
只有 update
而不是set
的相同代码才会被恰当地阻止,并且不会覆盖该对象。
我的规则有问题吗?是否有另一种方法可以阻止任何使用空对象的写操作?