{merge:true}を使用したセットと更新の違い


115

クラウドFirestore 3つの書き込み操作があります。

1)追加

2)セット

3)更新

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

あなたが使うときにも同じことが起こりますupdate(object) それで、もしあれば違いは何ですか?グーグルがロジックを複製するのは奇妙に思えます。

回答:


263

違いを理解する方法:

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

  • setwith mergeはドキュメントのフィールドを更新するか、存在しない場合は作成します

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

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

あなたが提供するデータの種類の違いもありますsetとはupdate

setあなたは常に、文書型のデータを提供する必要があります。

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

ではupdate、あなたはまた、ネストされた値を更新するためのフィールドのパスを使用することができます。

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

1
しかしcreate、APIでメソッドをどこで見つけましたか?
ZuzEL 2017年

2
cloud.google.com/nodejs/docs/reference/firestore/0.8.x/…fornode.js。Web APIにはそのメソッドがないようです。使用しているプラ​​ットフォームがわからなかった:)
Scarygami

10
あなたが言及できるもう1つの違いはsetupdateがフィールドパスと値のペアをとるドキュメント形式のデータを操作することです。この手段あなたが深くネストされた値に変更を加えることが可能updateで、より厄介であることをset。例:set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true)
Gil Gilbert、

ドキュメントの値を更新する場合、既に存在するドキュメントを更新するのは理にかなっています。set+ mergeallは、ドキュメントが存在しないものを作成するため、それほど有用ではないと思います
John Balvin Arias

setコマンドに提供するデータにnullのフィールドがある場合、データベースにすでに存在するフィールドはnullに設定されますか、それともそのままになりますか?
user1023110

71

「マージで設定」と「更新」のもう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
   }
 }`

1
これを自分でテストしてみましたか?ドキュメントにはセクションがあります。「ドキュメント全体を上書きせずにドキュメントの一部のフィールドを更新するには、update()メソッドを使用します...」リンク
Finlay Percy

2
私はそれを考え出した。私は以前、これを配列でのみ試しました。オブジェクトを配列に追加したかったところ、すべてがその配列で上書きされました。配列を含むフィールドでは機能しません...それはドキュメントに耐えます。
ravo10

1
テスト後に同じ結論に達しました。{ merge: true }更新機能と同じ効果を持つオプションが追加されることを期待しています。
ジョンライド

1
この回答をありがとう!例はシンプルですが、受け入れられた回答よりもクリーンなものになりました。
naiveai

2
を使用するときにネストされたフィールドのデータを上書きしないようにするには(上記の回答のように)、ドット表記updateを使用できます。ドット表記を使用する/使用しない場合、の上書き動作は異なります。update
テツコフスキー

7

ドキュメントごと: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
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.