我只想更新文档中的某些字段,所以我在文档here中发现了hasOnly
功能
但它不起作用,例如,下面的规则不起作用
function isValid(data){
return data.keys().hasOnly(['name','email','password'])
}
以及我在客户端SDK中更新
firestore.document("users/user_doc")
.update(mapOf(
"name" to "Jack",
"email" to "jack@gmail.com",
"password" to "12345"
)).addOnCompleteListener {
if (it.isSuccessful){
Log.d("app", "success")
}else{
Log.d("app", "failed")
}
}
但是它显示一个错误,缺少权限
以及hasAll
函数始终返回true!
那这个功能存在吗?为什么不起作用?
谢谢。
答案 0 :(得分:3)
另一种方法是:
allow update: if request.resource.data.diff(resource.data).changedKeys().hasOnly(["name", "email", "password"]);
答案 1 :(得分:0)
请记住,request.resource contains
文档将在写入操作成功后显示。它也包含现有字段,而不仅仅是您要更新的字段。
如果还有更多字段,则需要检查这些字段是否未被写入操作修改。因此,您需要检查它们在request.resource
和resource
中的值是否相同。我经常在规则中使用这样的功能:
function isUnmodified(key) {
return request.resource.data[key] == resource.data[key]
}
如果您的文档还有一个附加字段created
,则请确保未进行以下修改:
return data.keys().hasOnly(['name','email','password', 'created']) && isUnmodified('created')