Firestore初心者必見!SetとUpdateを使いこなしてドキュメント更新をマスターしよう

2024-04-02

Firestore の set と update の違い

Firestore でドキュメントを更新するには、主に setupdate の 2 つの方法があります。 どちらもドキュメントのデータを変更しますが、それぞれ異なる動作を持ちます。

Set

  • ドキュメント全体を新しいデータで置き換えます。
  • 存在しないフィールドは追加され、既存のフィールドは上書きされます。
  • オプション {merge: true} を指定することで、部分的な更新が可能になります。
    • 既存のフィールドは上書きされず、新しいフィールドのみ追加されます。

Update

  • 既存のドキュメントにのみ適用されます。
  • 指定されたフィールドのみ更新し、その他のフィールドは変更しません。
  • ネストされたフィールドや配列も個別に更新できます。

比較表

機能SetUpdate
動作ドキュメント全体を置き換える既存のドキュメントを部分的に更新する
存在しないフィールド追加される追加されない
既存のフィールド上書きされる変更されない
{merge: true}部分的な更新が可能不要

使用例

    • 新しいドキュメントを作成する場合
    • 部分的な更新を行う場合 ( {merge: true} を指定)
    • 既存のドキュメントの一部を更新する場合
    • 特定のフィールドのみを変更する場合

注意事項

  • setupdate は、ドキュメントの読み書き権限を持っているユーザーのみ使用できます。
  • set{merge: true} を使用する場合は、更新するフィールドのみを指定する必要があります。
  • update は、存在しないドキュメントに対してはエラーが発生します。

補足

  • 上記の比較表は、基本的な動作の違いをまとめたものです。詳細については、上記の参考資料を参照してください。
  • Firestore には他にも incrementarrayUnion などの更新方法があります。これらの方法は、特定のユースケースに特化したものなので、必要に応じて使い分けてください。



// Firebase App の初期化
const firebase = require('firebase/app');
firebase.initializeApp({
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
});

// Firestore への接続
const db = firebase.firestore();

// ドキュメントの参照
const docRef = db.collection("users").doc("user1");

// Set を使用したドキュメントの更新
docRef.set({
  name: "John Doe",
  age: 30,
  address: {
    city: "Tokyo",
    country: "Japan",
  },
});

// Update を使用したドキュメントの更新
docRef.update({
  age: 31,
  address: {
    city: "Osaka",
  },
});

// Set with {merge: true} を使用したドキュメントの更新
docRef.set({
  age: 32,
  hobbies: ["読書", "旅行"],
}, { merge: true });

コード解説

  1. Firebase App を初期化します。
  2. Firestore への接続を確立します。
  3. 更新対象となるドキュメントの参照を取得します。
  4. update を使用して、既存のドキュメントの一部のみ更新します。
  5. set{merge: true} を組み合わせて、部分的な更新を行います。

実行結果

  1. 最初の set によって、ドキュメント "user1" が作成されます。
  2. 2 番目の update によって、"age" フィールドのみ更新されます。
  3. 3 番目の set with {merge: true} によって、"age" フィールドが更新され、"hobbies" フィールドが追加されます。
  • サンプルコードを実行する前に、Firebase App の設定と Firestore への接続を確認してください。
  • ドキュメントの参照名は、実際に存在するドキュメント名に置き換えてください。



Firestore ドキュメントを更新するその他の方法

setupdate 以外にも、Firestore ドキュメントを更新する方法はいくつかあります。

  • increment

    • 数値フィールドの値を増減させるために使用します。
    • サーバーサイドで安全な方法で値を更新できます。
  • arrayUnion

    • 重複した要素を追加することはできません。
  • arrayRemove

  • delete

const docRef = db.collection("users").doc("user1");

// "age" フィールドの値を 1 増やす
docRef.update({
  age: firebase.firestore.FieldValue.increment(1),
});
const docRef = db.collection("users").doc("user1");

// "hobbies" フィールドに "音楽" という要素を追加
docRef.update({
  hobbies: firebase.firestore.FieldValue.arrayUnion("音楽"),
});
const docRef = db.collection("users").doc("user1");

// "hobbies" フィールドから "読書" という要素を削除
docRef.update({
  hobbies: firebase.firestore.FieldValue.arrayRemove("読書"),
});
const docRef = db.collection("users").doc("user1");

// ドキュメント "user1" を削除
docRef.delete();
  • 上記の方法は、それぞれ特定のユースケースに特化したものなので、必要に応じて使い分けてください。
  • increment は数値フィールドのみに使用できます。
  • arrayUnionarrayRemove は配列フィールドのみに使用できます。
  • delete はドキュメント全体を削除しますので、注意して使用してください。
  • Firestore には、transactionbatch などの高度な更新方法もあります。これらの方法は、複雑な更新処理を行う場合に役立ちます。

database firebase google-cloud-firestore


SQLiteでインデックスを使いこなす! 作成・削除方法とパフォーマンスへの影響を徹底解説

データベースインデックスは、特定の列にアクセスする際のクエリのパフォーマンスを向上させるために使用されるデータ構造です。インデックスは、テーブル内のデータの論理的な順序とは異なる順序でデータを格納することにより機能します。これにより、クエリエンジンは、テーブル全体をスキャンするのではなく、インデックスを使用して必要なデータに直接アクセスできるようになります。...


【完全ガイド】Redisデータベースの移行方法:RDB、AOF、Sentinel、Clusterを徹底比較

移行元サーバーでRDBファイルを作成する利点:シンプルで実行しやすいデータの整合性が保証されるダウンタイムが発生する大量のデータの場合、移行に時間がかかるRDBファイルよりも移行に時間がかかるAOFファイルが大きくなると、処理速度が遅くなる...


CREATE DATABASE行でmysqldumpバックアップを強化:利点と使用方法

CREATE DATABASE 行は、バックアップファイルの冒頭に含まれるオプションです。この行は、バックアップを復元する際に、データベースが存在しない場合は作成するように指示します。CREATE DATABASE 行を使用する利点バックアップを異なる MySQL サーバに復元する際に便利です。...


MySQL 権限変更のベストプラクティス:FLUSH PRIVILEGES コマンドの必要性と代替手段

MySQLでは、ユーザー権限を変更するたびにFLUSH PRIVILEGESコマンドを実行する必要があります。しかし、すべての権限変更で実行する必要があるのか、それとも特定の変更のみで実行する必要があるのかは、多くのユーザーにとって疑問です。...