しぐれ煮ログしぐれ煮ログコンビニでバイトしてます。Firebaseと「ユニークなユーザ名」の考え方ユーザ名に限った話ではないですが、UNIQUE制約のような他のドキュメントと重複しないユニークな値を持つフィールドの考え方についてです。Functionsを用いて、ユーザがユニークなユーザ名を持つ状態について考えます。サンプルコードはこちらです。サンプルコードサンプルコード(コピペ)コードの読み方コレクションpostsにドキュメントを書き込む例。書き込み書き込みを考えるユーザ名をusersコレクションに書き込むとして以下のようなモデルを考えます。}このuserをコレクションusersに書き込みますが、ドキュメントのIDをユーザのIDにすると、常にユーザ名から参照userRefが定義できます。.doc(userId)参照userRefから、ユーザ名を持つドキュメントuserはこのように書き込みできます。userRef.set(user)重複を確認するユーザ名qrunchがユニークになるように、既にこのユーザ名が存在しないか確認しなければいけません。ここでは、ユーザ名が格納されたコレクションusernamesを定義します。ユーザ名がユニークであることを、ドキュメントのIDがユニークであることで実現します。ユーザ名がIDとなるドキュメントusernamesを考え、参照usernameRefを定義します。.doc(usernameId)ユーザ名のドキュメントusernameを定義します。}ドキュメントを取得して空であれば、それはユーザ名はまだ使用されていないことを意味します。!usernameSnap.emptyは「スナップショットが空でないこと」を意味してます。トランザクションを考える「ドキュメントが存在しないこと」を確認した後に、目的のドキュメントを更新することになります。「ドキュメントの取得」と「ドキュメントの更新」の間に「ドキュメントの書き込み」が行われる可能性を考えなければなりません。FirestoreではrunTransactionを用いてそれを防ぎます。トランザクションは「ドキュメントの読み取り」を終えてから「ドキュメントの書き込み」を実行する一連の処理をまとめて送信します。ユーザ名のドキュメントを取得するユーザを取得するユーザがいない場合はエラーを返すユーザ名のドキュメントを取得するユーザ名のドキュメントが既に存在する場合はエラーを返すユーザが既にユーザ名を持っている場合は前のユーザ名を削除ユーザ名のドキュメントを書き込むユーザのドキュメントにユーザ名を書き込むエラー処理を無くすとこのように考えられます。})おまけログイン認証ユーザ名はonCallトリガーでは、https.CallableContextから取得できます。関数を呼び出したユーザがログインしていない場合はvoidになります。よってuserIdはユーザ名またはnullになります。ユーザIDの無い(ログインしていない)場合は、エラーを返して関数を落としてください。https.onCall(handler)ユーザ名と正規表現ユーザ名はドキュメントのIDになるので、IDとして扱えない場合は関数を落としてください。}エラーを返すクライアントサイドに適切なエラーを返してあげてください。返せるエラーは決まっています。FunctionsErrorCodeに存在しないエラーコードは全てINTERNALになるので注意してください。予期しないエラーでクラウド関数の内部の情報が漏洩するのを防ぐためです。