🧯

DocumentIDとは???

2024/03/22に公開

📕Overview

https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/DocumentSnapshot-class.html

DocumentSnapshotには、FirebaseFirestoreデータベース内のドキュメントから読み取られたデータが含まれています。

データは、data プロパティを使用して抽出するか、添え字構文を使用して特定のフィールドにアクセスすることによって抽出できます。

id -> String
このスナップショットに対してこのドキュメントに指定された ID。

🧷summary

Firestoreを使ったアプリで、CRUD処理を実装したいことがある。編集と削除をするときに、.doc(uid)を使うことが多いのですがこれだと、特定のユーザーが作ったデータ1個しか編集と削除をできません!

複数のデータを.addで作るユースケースがあります。この場合だと、ランダムなドキュメントIDが生成されて保存されます。アルファベット大文字小文字と数字からなる20行の文字列です。

こんな感じかな...
GoPdXIyV5SPcGak92MGm

ドキュメントIDを取得するには、公式にも書いてありますが、DocumentSnapshotにはのdataプロパティを使います。これを格納した変数を使って、.で繋げるとidを取得できます。

こんな感じか?

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:todo_app/domain/todo.dart';
// todoコレクションを操作するwithConverter

final todoWithConverter = FirebaseFirestore.instance
    .collection('todo')
    .withConverter<Todo>(
      fromFirestore: (snapshot, _) {
        final data = snapshot.data()!;
        data['id'] = snapshot.id;
        return Todo.fromJson(data);
      },
      toFirestore: (todo, _) => todo.toJson(),
    );

withConverterと呼ばれる機能を使うと、データ型を型安全に扱うことができます。どうゆうことだって話ですけどね。モデルクラスのidはStringだけど、これをfunctionのargmentsに渡してもエラーが出ます。
data()で、スナップショットを取得しないと、DocumentIDは取れないようです。
スナップショットってのは、専門用語によると、ファイル、ディレクトリ、データベースファイルなどの状態を抜き出したものだそうです。

まあ、View側で取得して、渡すこともできますけどね。昔書いたコードだとこんな感じかな...
https://zenn.dev/joo_hashi/books/ddceed5b07c26a/viewer/501db6

IconButton(
      onPressed: () async {
        final id = document.reference.id;
        await service.deleteMemo(id);
      },
      icon: const Icon(Icons.delete))

withConverterのidのところをsnapshot.reference.idにしても良い。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:todo_app/domain/todo.dart';
// todoコレクションを操作するwithConverter

final todoWithConverter = FirebaseFirestore.instance
    .collection('todo')
    .withConverter<Todo>(
      fromFirestore: (snapshot, _) {
        final data = snapshot.data()!;
        data['id'] = snapshot.reference.id;
        return Todo.fromJson(data);
      },
      toFirestore: (todo, _) => todo.toJson(),
    );

🧑‍🎓thoughts

今回は、ランダムに生成されたDocumentIDの使い方について解説しました。CRUDできるアプリのサンプルコードも公開してるので、ご興味ある方は試してみてください。
こちらが完成品

参考にした書籍。ただしこれは、Vue.jsでWebアプリを作るものなので、設計とか認証・認可をFirebaseを使ってやってる仕組みについて学ぶものです。私は参考になったかな。

Firebaseの入門書

Discussion