React Native Firebaseを試してみる3(Cloud Firestore編)

前提

・React Native Firebaseがインストール済である事

インストール

公式ドキュメントを見ればすぐできるので省略

試してみる

データの追加

let ref = firebase.firestore().collection('addDB');
// 追加
ref.add({
  key: 1,
  value: "something1",
}).then(function(doc) {
  console.log("add success:" , doc.id);
})
.catch(function(error) {
  console.error("add error: ", error);
});

docを指定しない場合、ランダムな値のドキュメントが作られますが、
以下のように指定する事もできます。
ドキュメントを指定しない場合はadd、指定する場合はsetになる事に注意。

let ref = firebase.firestore().collection('addDB').doc('addDoc');
// 追加
ref.set({
  key: 2,
  value: "something2",
}).then(function(doc) {
  console.log("add success:" , doc.id);
})
.catch(function(error) {
  console.error("add error: ", error);
});

データの更新

データの更新はupdateに値を渡すだけです。
mapの更新は下2行のどちらかの方法でできます。

let ref = firebase.firestore().collection('updateDB').doc('updateDoc');

// 追加
ref.set({ key: 1, value: "value1", properties: { color: "red", country: "japan" } });

// 更新
ref.update({ properties: { food: "blue", country: "america" } });
ref.update({ "properties.color": "yellow" });

データの取得

where(“group", “==", “2")と指定しているので、groupに2を設定しているデータが取得できる。(下2件)

// 登録
firebase.firestore().collection('getDB').doc('getDoc1')
.set({ key: '1', value: "value1", group: "1" });
firebase.firestore().collection('getDB').doc('getDoc2')
.set({ key: '2', value: "value2", group: "1" });
firebase.firestore().collection('getDB').doc('getDoc3')
.set({ key: '3', value: "value3", group: "1" });
firebase.firestore().collection('getDB').doc('getDoc4')
.set({ key: '4', value: "value4", group: "2" });
firebase.firestore().collection('getDB').doc('getDoc5')
.set({ key: '5', value: "value5", group: "2" });

// 取得
firebase.firestore().collection("getDB").where("group", "==", "2").get()
.then(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
    console.log(doc.data().key)
  });
})
.catch(function(error) {
});

onSnapshotとすると、変更時にコールバックを受け取る事ができる。
・keyが3のgroupを2に変更した場合、下3件のデータでonSnapshot()が実行される。
・keyが4のgroupを1に変更した場合、1番のデータでonSnapshot()が実行される。

// 取得
firebase.firestore().collection("getDB").where("group", "==", "2")
.onSnapshot(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
    console.log(doc.data().key)
  });
});

トランザクション

1つ以上のドキュメントに対して読み書きの一連の処理をする場合に使います。

// 登録
let ref = firebase.firestore().collection('tranDB').doc('tranDoc');
ref.set({ key: "1", amount: 1000 });

// 取得
firebase.firestore().runTransaction(function(transaction) {
  return transaction.get(ref).then(function(doc) {
    if (!doc.exists) {
      throw "not found.";
    }
    var newAmount = doc.data().amount + 1;
    transaction.update(ref, { amount: newAmount });
  });
}).then(function(success) {
}).catch(function(error) {
});

バッチ処理

1つ以上のドキュメントに対して書き込みの一連の処理をする場合に使います。
〇トランザクション:読み込みが必要な場合に使用する
〇バッチ処理:読み込みが必要ない場合に使用する

let batch = firebase.firestore().batch();
let ref1 = firebase.firestore().collection('batchDB').doc('batchDoc');
// set
batch.set(ref1, { key: "1", amount: 1000 });

// コメントアウトを外すと、存在しないデータにupdateするためエラーになる。
// エラーの場合、doc('batchDoc')の登録もロールバックされる。
// let ref2 = firebase.firestore().collection('batchDB').doc('batchDoc2');
// batch.update(ref2, { key: "1", amount: 2000 });

batch.commit().then(function () {
  console.log('batch success')
}).catch(function (error) {
  console.log('batch error')
});