Firestore:使用指定的UID创建文档,最终使用set()创建文档,但不更新字段

时间:2019-07-07 15:46:41

标签: android firebase google-cloud-firestore

考虑以下几行:

        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(不执行它)。

1 个答案:

答案 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