考虑以下几行:
Map<String, Object> the_data = new HashMap<>();
the_data.put("login", "Anonymous");
the_data.put("avatar_is_defined", false);
the_data.put("amount", 0.0);
the_data.put("deleted", false);
the_data.put("can_read_user", true);
Toast.makeText(this, "Initializing your data... Please wait until the screen appears.", Toast.LENGTH_SHORT).show();
user_database_model.getReferenceToUser(signed_in_user_uid).set(the_data, SetOptions.mergeFields("")).addOnCompleteList[...]
用户首次登录时,必须执行此set
调用,并且必须在UID为signed_in_user_uid
的文档中实际设置所有这些字段。
但是,如果用户再次登录(即:该文档已存在),则此set
要么必须被忽略(不执行)(实际上这是不可能的,请参见最后一页)段落),否则不得更新其字段(这就是为什么我写SetOptions.mergeFields("")
失败了)
是否可以调用一个set
函数,说“ Firestore,请创建此文档,并在不存在的情况下用提供的字段填充它;但是如果已经存在,则...什么都不做”?
重要提示:由于《 Firestore安全规则》 ,我无法get()
知道该文档是否存在。 (在回调函数中,只有在它不存在的情况下,我才调用set
)。因此,实际上不可能避免调用set
(不执行它)。
答案 0 :(得分:1)
如果您只希望用户能够一次创建其文档,而从不对其进行更新,则可以按照以下安全规则进行操作:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
// Applies to writes to nonexistent documents
allow create: if request.auth.uid != null;
// Reject writes to existing documents
allow update: if false;
}
}
}
如果您想让客户端代码检测文档是否已经存在,如果不存在,请创建文档use a transaction。