firestoreを使ってて、あれコイツはdata()
持ってないんだっけ、あれコイツにはupdate()
できないんだっけ?と混乱したので整理してみました。
サマリ
// これはDocumentReference
// ただの参照であって実体はない
const shopDocRef = db.collection('shops').doc('1');
// add, set, update, deleteなどの操作は
// Referenceに対して行う
await shopDocRef.update({name: "レストラン品川"});
// referenceに対してget()で
// 実体であるDocumentSnapshotを得る
const shopDoc = await shopDocRef.get();
// DocumentSnapshotoにdata()すると
// データを取得できる
const shop = shopDoc.data();
Reference
referenceはただの参照。ドキュメントやコレクションへのパス情報だけで、中身を持っていない。
データの追加、更新、削除はreferenceに対して行う。
CollectionReference
コレクションへの参照。
// CollectionReference
// - id
// - path
// - parent
const shopsCollectionReference = db.collection('shops')
DocumentReference
ドキュメントへの参照。
// DocumentReference
// - id
// - path
// - parent
const shopDocumentReference = db
.collection('shops') // ここまででCollcectionReferenceを取得
.doc('1');
追加、更新、削除はreferenceに対して行う
特定のドキュメントの更新、削除
const shopDocumentReference = db
.collection('shops')
.doc('1');
// ドキュメント更新
await shopDocumentReference.update({name: "レストラン品川 1号店"})
// ドキュメント削除
await shopDocumentReference.delete()
コレクションにドキュメントを追加。下の例ではidを自動採番。
const shopsCollectionReference = db.collection('shops');
// ドキュメント追加
await shopsCollectionReference.add({name: "恵比寿コーヒー", place: "恵比寿"})
idを指定したい場合の書き方
// ドキュメントidに"4"を指定
const shopDocumentReference = db.collection("shops").doc("4");
// ドキュメント追加
await shopDocumentReference.set({ name: "恵比寿コーヒー", place: "恵比寿" });
Snapshot
中身の実態。
referenceに対してget()
することで取得できる。
get()
は非同期に実行されるのでawait
で実行する。
DocumentSnapshot
ドキュメントの実態。
.data()
メソッドでデータのオブジェクトを取得できる。
// DocumentSnapshot
// - exist
// - id
// - ref
const shopDocumentSnapshot = await db
.collection('shops') // ここまででCollcectionReferenceを取得
.doc('1') // ここまででDocumentReferenceを取得
.get(); // snapshotを非同期で取得
// data
const shop = shopDocumentSnapshot.data();
// DocumentReference
const shopDocumentReference = shopDocumentSnapshot.ref
Query関連
検索で使う。
Query
ただの検索条件の定義。まだ何も中身を取得していない。
// Query
const query = db
.collection('shops')
.where('place', '==', '品川');
QuerySnapshot
Query
に対してget()
すると検索を実行して中身を取得する。
その中身がQuerySnapshot
。
docs
という配列を持っていて、この配列にqueryDocumentSnapshot
が複数格納されている。
queryDocumentSnapshot
はDocumentSnapshot
とほぼ同じぽい。
// QuerySnapshot
// - docs (Array)
// - empty (bool)
// - query (Query)
// - size (number)
const querySnapshot = await db
.collection('shops')
.where('place', '==', '品川')
.get()
if(querySnapshot.size > 0){
// DocumentSnapshotと同じ
const queryDocumentSnapshot = querySnapshot.docs[0]
// data
const shop = queryDocumentSnapshot.data()
// DocumentReference
const bookDocumentReference = queryDocumentSnapshot.ref
}
#参考URL
Cloud Firestore にデータを追加する