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

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

1) 추가

2) 설정

3) 업데이트

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

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



답변

차이점을 이해 한 방법 :

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

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

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

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

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

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

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

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

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


답변

“병합으로 설정”과 “업데이트”간의 또 다른 차이점 (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
   }
 }`


답변

문서 별 : 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
})


답변