Обновление Firestore с объединением - как перезаписать часть документа - PullRequest
2 голосов
/ 11 октября 2019

При обновлении документа в Firestore я хочу сохранить большую часть документа, но изменить одно свойство, содержащее объект.

Что у меня есть

{
  name: "John Doe",
  email: "me@example.com",
  friends: {
     a: {...},
     b: {...},
     c: {...},
     d: {...},
     e: {...},
     f: {...},
  }
}

Теперь у меня есть новый объект друзей, такой как {x: ..., y: ..., z: ...}

Я хочу перезаписать дерево friends моего документа, но оставить все остальные поля.

Что яхочу, чтобы это выглядело как

{
  name: "John Doe",
  email: "me@example.com",
  friends: {
     x: {...},
     y: {...},
     z: {...},
  }
}

Однако, если я сделаю firestore.doc(...).update({friends: {...}}, { merge: true })

То, что я в настоящее время получаю

{
  name: "John Doe",
  email: "me@example.com",
  friends: {
     a: {...},
     b: {...},
     c: {...},
     d: {...},
     e: {...},
     f: {...},
     x: {...},
     y: {...},
     z: {...},
  }
}

Я знаю, что могу сделать два обновления, то есть удалить поле и затем установить его заново, или я могу прочитать документ, изменить объект и сохранить его без слияния.

Но разве не существует разумного способа перезаписать объект (карту), не затрагивая остальную часть документа?

1 Ответ

2 голосов
/ 11 октября 2019

Поскольку вы используете метод update(), вам просто нужно вызвать его без опции слияния.

firestore.doc(...).update({friends: {...}})

Обратите внимание, что update() имеет две разные подписи:

update(data: UpdateData)

и

update(field: string | FieldPath, value: any, ...moreFieldsAndValues: any[])

Если первый аргумент, передаваемый методу, является объектом, он будет считать, что вы используете первую сигнатуру и, следовательно,Вы можете передать только один аргумент. При выполнении

firestore.doc(...).update({friends: {...}}, { merge: true })

должна появиться следующая ошибка:

" Ошибка: функция DocumentReference.update () требует 1 аргумент, но была вызвана с 2 аргументами. "


С другой стороны, вы могли бы назвать это так:

  firestore
    .collection('...')
    .doc('...')
    .update(
      'friends.c',
      'Tom',
      'email', 
      'mynew_email@example.com',
      'lastUpdate',
      firebase.firestore.FieldValue.serverTimestamp()
    );

Наконец, чтобы завершить, обратите внимание, что если вы делаете следующее (прохождение одна строка)

  firestore
    .collection('...')
    .doc('...')
    .update(
      'a_string'
    );

вы получите следующую ошибку

" Ошибка: функция DocumentReference.update () требует как минимум 2 аргумента, но была вызвана с1 аргумент."

, что имеет смысл: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...