source

{merge: true}이(가) 포함된 Firestore 세트와 업데이트 간의 차이점

ittop 2023. 6. 26. 23:09
반응형

{merge: true}이(가) 포함된 Firestore 세트와 업데이트 간의 차이점

Cloud Firestore에는 세 가지 쓰기 작업이 있습니다.

  1. add()
  2. set()
  3. update()

문서에는 다음과 같이 나와 있습니다.set(object, { merge: true })지정한 개체를 기존 문서와 병합합니다.

사용할 때도 마찬가지입니다.update(object)그래서 무엇이 다른가요?구글이 이런 기능을 복제한다는 것은 이상해 보입니다.

차이를 이해하는 방법:

  • set없이.merge문서가 아직 존재하지 않으면 문서를 덮어쓰거나 문서를 만듭니다.

  • set와 함께merge문서의 필드를 업데이트하거나 문서가 없는 경우 필드를 작성합니다.

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

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

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

위해서set항상 문서 모양의 데이터를 제공해야 합니다.

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

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

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

" 병합으로 설정"과 "업데이트" 사이의 또 다른 차이점은 중첩된 값으로 작업할 때입니다.

다음과 같이 구성된 문서가 있는 경우:

 {
   "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
})

지도에서 중첩된 필드를 삭제하려면 위의 답변에 추가하여 사용할 수 있습니다.update또는set사용 사례에 따라 다릅니다.

다음으로 시작하고 다음 이외의 모든 프로필 항목을 제거하려면"user1"그러면 두 가지 옵션이 있습니다.

{
  "users": {
    "profiles": {
      "user1": ...,
      "user2": ...
    }
  }

갱신하다

덮어씁니다.profiles무엇이 제공되든 간에

update({
  'users.profiles': { 'user1': ... }
})

세트

이렇게 하면 삭제된 내용이 기존 프로필에 병합되어 삭제되지 않은 내용이 남습니다.

set({
  users: {
    profiles: {
      'user2': FieldValue.delete(),
      'user3': FieldValue.delete(),
      ...
    }
  }
}, { merge: true })

이는 에만 적용됩니다.Map둘 다set그리고.update와 같은 어레이 관련 연산자를 명시적으로 사용하지 않으면 어레이를 덮어씁니다.

무서운 가미 답은 파이어베이스 버전 9에도 적용됩니다.작은 변경 사항은 다음과 같이 고려해야 합니다.

  • 사용하다setDocset를 들어, 예들어대를 하는 대신에 사하는신용을 합니다.db.collection('users').doc('random-id').set({ 'admin': true });,사용하다setDoc(doc(db, 'users', 'random-id'), { "admin": true })
  • 사용하다updateDocupdate를 들어, 예들어대를 하는 대신에 사하는신용을 합니다.db.collection('users').doc( random-id').update({"age": 27}),사용하다 await updateDoc(doc(db, 'users', 'random-id'), { "age": 27})

언급URL : https://stackoverflow.com/questions/46597327/difference-between-firestore-set-with-merge-true-and-update

반응형