{merge : true}를 사용한 세트와 업데이트의 차이점


115

에서 클라우드 경우 FireStore 세 가지 쓰기 작업이 있습니다 :

1) 추가

2) 설정

3) 업데이트

문서에서 사용 set(object, {merge: true})하면 기존 개체와 병합됩니다.

사용할 때도 마찬가지입니다. update(object) 그렇다면 차이점은 무엇입니까? Google이 논리를 복제하는 것이 이상하게 보입니다.

답변:


263

차이점을 이해 한 방법 :

  • set없이는 merge문서를 덮어 쓰거나 아직 존재하지 않는 경우 생성합니다.

  • setmerge문서에 필드를 업데이트하거나 존재하지 않는 경우를 작성합니다

  • update 필드를 업데이트하지만 문서가 없으면 실패합니다.

  • create 문서를 만들지 만 문서가 이미있는 경우 실패합니다.

set및에 제공하는 데이터의 종류에도 차이가 있습니다 update.

들어 set당신은 항상 문서 형태의 데이터를 제공해야합니다 :

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

와 함께 update중첩 된 값을 업데이트하기 위해 필드 경로를 사용할 수도 있습니다.

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

1
하지만 createAPI 에서 메소드를 어디에서 찾았 습니까?
ZuzEL

2
node.js의 경우 cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… 웹 API에는 해당 방법이없는 것 같습니다. 확인하는 플랫폼 당신은 :)에 있습니다 아니었다
Scarygami

10
언급 할 수있는 또 다른 차이점 은 필드 경로와 값 쌍을 사용 set하는 문서 형태의 데이터에서 작동 한다는 것 update입니다. update즉,에서 더 성가신 깊이 중첩 된 값을 변경할 수 있습니다 set. 예를 들면 : set({a: {b: {c: true}}}, {merge: true})update('a.b.c', true).
길 길버트

문서의 값을 업데이트하려면 이미 존재하는 문서를 업데이트하고 싶은 것이 합리적이므로 set + mergeall은 문서가 존재하지 않는 것을 생성하므로 유용하지 않다고 생각합니다.
John Balvin Arias

set 명령에 제공하는 데이터에 null 인 필드가있는 경우 데이터베이스에 이미있는 경우 필드를 null로 설정합니까 아니면 그대로 두겠습니까?
user1023110

71

"병합으로 설정"과 "업데이트"간의 또 다른 차이점 (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
직접 테스트 해 보셨습니까? "... 업데이트 () 메소드를 사용하여, 전체 문서를 덮어 쓰지 않고 문서의 일부 필드를 업데이트하려면"문서의 부분이 있습니다 링크
핀리 퍼시

2
나는 그것을 알아. 나는 전에 배열로 이것을 시도했습니다. 배열에 객체를 추가하고 싶었고 해당 배열에 대해 모든 것을 덮어 썼습니다. 배열을 포함하는 필드에서는 작동하지 않습니다.
ravo10

1
테스트 후 같은 결론에 도달했습니다. { merge: true }업데이트 기능 과 같은 효과가있는 옵션이 추가 되길 바랍니다 .
Johnride 2019 년

1
이 답변에 감사드립니다! 예제는 간단하지만 내 사용 사례에 더 적합한 대답보다 더 깨끗하게 만들었습니다.
naiveai

2
update사용할 때 중첩 된 필드 (위 답변 참조)의 데이터를 덮어 쓰지 않으려면 점 표기법을 사용할 수 있습니다 . update점 표기법을 사용하거나 사용하지 않으면 의 덮어 쓰기 동작 이 다릅니다.
Tedskovsky

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.