Firestore初心者必見!SetとUpdateを使いこなしてドキュメント更新をマスターしよう
Firestore の set と update の違い
Firestore でドキュメントを更新するには、主に set
と update
の 2 つの方法があります。 どちらもドキュメントのデータを変更しますが、それぞれ異なる動作を持ちます。
Set
- ドキュメント全体を新しいデータで置き換えます。
- 存在しないフィールドは追加され、既存のフィールドは上書きされます。
- オプション
{merge: true}
を指定することで、部分的な更新が可能になります。- 既存のフィールドは上書きされず、新しいフィールドのみ追加されます。
Update
- 既存のドキュメントにのみ適用されます。
- 指定されたフィールドのみ更新し、その他のフィールドは変更しません。
- ネストされたフィールドや配列も個別に更新できます。
比較表
機能 | Set | Update |
---|---|---|
動作 | ドキュメント全体を置き換える | 既存のドキュメントを部分的に更新する |
存在しないフィールド | 追加される | 追加されない |
既存のフィールド | 上書きされる | 変更されない |
{merge: true} | 部分的な更新が可能 | 不要 |
使用例
-
- 新しいドキュメントを作成する場合
- 部分的な更新を行う場合 (
{merge: true}
を指定)
-
- 既存のドキュメントの一部を更新する場合
- 特定のフィールドのみを変更する場合
注意事項
set
とupdate
は、ドキュメントの読み書き権限を持っているユーザーのみ使用できます。set
で{merge: true}
を使用する場合は、更新するフィールドのみを指定する必要があります。update
は、存在しないドキュメントに対してはエラーが発生します。
補足
- 上記の比較表は、基本的な動作の違いをまとめたものです。詳細については、上記の参考資料を参照してください。
- Firestore には他にも
increment
やarrayUnion
などの更新方法があります。これらの方法は、特定のユースケースに特化したものなので、必要に応じて使い分けてください。
// 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 });
コード解説
- Firebase App を初期化します。
- Firestore への接続を確立します。
- 更新対象となるドキュメントの参照を取得します。
update
を使用して、既存のドキュメントの一部のみ更新します。set
と{merge: true}
を組み合わせて、部分的な更新を行います。
実行結果
- 最初の
set
によって、ドキュメント "user1" が作成されます。 - 2 番目の
update
によって、"age" フィールドのみ更新されます。 - 3 番目の
set
with{merge: true}
によって、"age" フィールドが更新され、"hobbies" フィールドが追加されます。
- サンプルコードを実行する前に、Firebase App の設定と Firestore への接続を確認してください。
- ドキュメントの参照名は、実際に存在するドキュメント名に置き換えてください。
Firestore ドキュメントを更新するその他の方法
set
と update
以外にも、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
は数値フィールドのみに使用できます。arrayUnion
とarrayRemove
は配列フィールドのみに使用できます。delete
はドキュメント全体を削除しますので、注意して使用してください。
- Firestore には、
transaction
やbatch
などの高度な更新方法もあります。これらの方法は、複雑な更新処理を行う場合に役立ちます。
database firebase google-cloud-firestore