回答:
違いを理解する方法:
setなしでmergeは、ドキュメントは上書きされるか、まだ存在しない場合は作成されます
setwith mergeはドキュメントのフィールドを更新するか、存在しない場合は作成します
update フィールドを更新しますが、ドキュメントが存在しない場合は失敗します
create ドキュメントを作成しますが、ドキュメントがすでに存在する場合は失敗します
あなたが提供するデータの種類の違いもありますsetとはupdate。
setあなたは常に、文書型のデータを提供する必要があります。
set(
{a: {b: {c: true}}},
{merge: true}
)
ではupdate、あなたはまた、ネストされた値を更新するためのフィールドのパスを使用することができます。
update({
'a.b.c': true
})
set、updateがフィールドパスと値のペアをとるドキュメント形式のデータを操作することです。この手段あなたが深くネストされた値に変更を加えることが可能updateで、より厄介であることをset。例:set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true)。
「マージで設定」と「更新」のもう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
}
}`
{ merge: true }更新機能と同じ効果を持つオプションが追加されることを期待しています。
ドキュメントごと:https : //firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects
ドット表記を使用すると、他のネストされたフィールドを上書きせずに、単一のネストされたフィールドを更新できます。ドット表記なしでネストされたフィールドを更新すると、マップフィールド全体が上書きされます。
上で述べたように、これはフレンド構造全体を置き換えます。
db.collection('users').doc('random-id').update({
"friends": {
"friend-uid-3": true
}
})
これはしません。
db.collection('users').doc('random-id').update({
"friends.friend-uid-3": true
})
create、APIでメソッドをどこで見つけましたか?