Cloud Firestoreには、3つの書き込み操作があります。
1)追加
2)セット
3)アップデート
ドキュメントでは、set(object, {merge: true})
を使用するとオブジェクトが既存のオブジェクトとマージされると書かれています。
update(object)
を使用しても同じことが起こります。 Googleがロジックを複製するのは奇妙に思えます。
違いを理解した方法:
set
マージなしでは、ドキュメントが上書きされるか、まだ存在しない場合は作成されます
set
mergeを使用すると、ドキュメント内のフィールドが更新されるか、存在しない場合は作成されます
update
はフィールドを更新しますが、ドキュメントが存在しない場合は失敗します
create
はドキュメントを作成しますが、ドキュメントが既に存在する場合は失敗します
set
とupdate
に提供するデータの種類にも違いがあります。
set
の場合、常にドキュメント形式のデータを提供する必要があります。
set(
{a: {b: {c: true}}},
{merge: true}
)
update
を使用すると、フィールドパスを使用してネストされた値を更新することもできます。
update({
'a.b.c': true
})
「set with merge」と「update」のもう1つの違い(Scarygamiの答えの拡張)は、ネストされた値を操作する場合です。
このような構造のドキュメントがある場合:
{
"friends": {
"friend-uid-1": true,
"friend-uid-2": true,
}
}
{"friend-uid-3" : true}
を追加したい
これを使用して:
db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})
このデータになります:
{
"friends": {
"friend-uid-1": true,
"friend-uid-2": true,
"friend-uid-3": true
}
}
ただし、update
はこれを使用します。
db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })
このデータになります:
`{
"friends": {
"friend-uid-3": true
}
}`