web-dev-qa-db-ja.com

{merge:true}での設定と更新の違い

Cloud Firestoreには、3つの書き込み操作があります。

1)追加

2)セット

3)アップデート

ドキュメントでは、set(object, {merge: true})を使用するとオブジェクトが既存のオブジェクトとマージされると書かれています。

update(object)を使用しても同じことが起こります。 Googleがロジックを複製するのは奇妙に思えます。

62
ZuzEL

違いを理解した方法:

  • setマージなしでは、ドキュメントが上書きされるか、まだ存在しない場合は作成されます

  • set mergeを使用すると、ドキュメント内のフィールドが更新されるか、存在しない場合は作成されます

  • updateはフィールドを更新しますが、ドキュメントが存在しない場合は失敗します

  • createはドキュメントを作成しますが、ドキュメントが既に存在する場合は失敗します

setupdateに提供するデータの種類にも違いがあります。

setの場合、常にドキュメント形式のデータを提供する必要があります。

set(
  {a: {b: {c: true}}},
  {merge: true}
)

updateを使用すると、フィールドパスを使用してネストされた値を更新することもできます。

update({
  'a.b.c': true
})
137
Scarygami

「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
   }
 }`
46
Finlay Percy