2020.2.25
2020.2.27

Cloud Firestoreでデータの操作(追加、更新、削除、取得)

Googleのモバイルプラットフォーム「Firebase」で使うことができるデータベース「Cloud Firestore」のデータ操作方法について、ウェブ版(JavaScript)の基本的なものをメモしておきます。

目次

  • 準備
  • データの追加
  • データの更新
  • データの削除
  • 単一データの取得
  • 全データの取得
  • 条件に合致するデータの取得
  • 参考リンク

準備

Cloud Firestoreにアクセスしてデータの操作を行うために、まず、以下の外部JSファイルを参照します。


<script src="https://www.gstatic.com/firebasejs/7.8.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js"></script>

続いて、Firebaseの設定で「APIキー」と「プロジェクトID」を指定します。


firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

var db = firebase.firestore();

データベースのセキュリティルールは「テストモード」ですべてのユーザーがデータを読み書きできる前提とします。

準備は以上で終わり。

なお、Firestoreは「コレクション」が「テーブル」、「ドキュメント」が「レコード(データ)」という位置付けになります。最初は『ドキュメントってなによ...』という感じでしたが、使っていればすぐに慣れます。

データの追加

「products」というコレクションにデータ(ドキュメント)を追加する場合、「add」を使って以下のようにします。


function createProduct() {
  db.collection("products").add({
    name: "sample product",
    created_at: firebase.firestore.FieldValue.serverTimestamp(),
    updated_at: firebase.firestore.FieldValue.serverTimestamp()
  })
  .then(function (doc) {
    console.log("Document create with ID: ", doc.id);
  })
  .catch(function (error) {
    console.error("Error creating document: ", error);
  });
}

「firebase.firestore.FieldValue.serverTimestamp()」は指定することでサーバ側のタイムスタンプが登録されます。クライアント側の日時がいいのであれば「new Date()」に置き換えます。

事前にFirebaseのコンソールからコレクション「products」を追加しておく必要はありません。データを登録したタイミングでコレクションが自動で追加されます。

データの更新

指定したフィールドのみ更新する場合は「update」を使います。


function updateProduct() {
  db.collection("products").doc("xxxxxxxxxx").update({
    name: "sample product 2",
    updated_at: firebase.firestore.FieldValue.serverTimestamp()
  })
  .then(function() {
    console.log("Document successfully updated!");
  })
  .catch(function(error) {
    console.error("Error updating document: ", error);
  });
}

doc()で指定している「xxxxxxxxxx」には、更新したいデータ(ドキュメント)のIDを指定します。

すべてのフィールドを上書きする(差し替える)場合は「set」を使います。


function setProduct() {
  db.collection("products").doc("xxxxxxxxxx").set({
    name: "sample product 2",
    created_at: firebase.firestore.FieldValue.serverTimestamp(),
    updated_at: firebase.firestore.FieldValue.serverTimestamp()
  })
  .then(function() {
    console.log("Document successfully updated!");
  })
  .catch(function(error) {
    console.error("Error updating document: ", error);
  });
}

「update」と「set」で更新の動作が違うのでコピペには気を付けましょう。

データの削除

データ(ドキュメント)を削除する場合は「delete」を使います。


function deleteProduct(){
  db.collection("products").doc("xxxxxxxxxx").delete().then(function(){
    console.log("Document successfully deleted!");
  })
  .catch(function(error) {
    console.error("Error deleting document: ", error);
  });      
}

単一データの取得

特定(単一)のデータを取得する場合、データ(ドキュメント)のIDを指定して「get」します。


function getProduct() {
  db.collection("products").doc("xxxxxxxxxx").get().then((doc) => {
    if (doc.exists) {
      console.log(doc.id);
      console.log(doc.data());
    } else {
      console.log("data is not found.");
    }
  })
  .catch(function (error) {
    console.error("Error getting document: ", error);
  });
}

get()がエラーの時と、指定したIDのデータが存在しない場合で分岐が異なるので注意。

全データの取得

全データを取得する場合は以下の通りです。


function getProducts() {
  db.collection("products").get().then((docs) => {
    docs.forEach((doc) => {
      console.log(doc.id);
      console.log(doc.data());
    });
  })
  .catch(function (error) {
    console.error("Error getting document: ", error);
  });
}

条件に合致するデータの取得

条件を指定してデータを絞り込む場合は「where」を使います。


function getProducts() {
  db.collection("products")
        .where("price", ">=", 100).where("price", "<", 500)
        .get().then((docs) => {
    docs.forEach((doc) => {
      console.log(doc.id);
      console.log(doc.data());
    });
  })
  .catch(function (error) {
    console.error("Error getting document: ", error);
  });
}

参考リンク

Firebase】関連記事