Firestore Обновить поля во вложенных объектах с помощью динамического ключа - PullRequest
0 голосов
/ 03 июня 2018

Мне нужно обновить поле во вложенном объекте с помощью динамического ключа.путь может выглядеть следующим образом: level1.level2.DYNAMIC_KEY: updatedValue Метод update удаляет все остальное на уровне 1, а не только обновляет поле во вложенном объекте.Update () действует больше как set ().Что я делаю не так?

Я уже пробовал следующее:

Я прочитал документацию https://firebase.google.com/docs/firestore/manage-data/add-data#update-data, но это так) а) статический и б) все еще удаляет другие поля.

Обновление полей во вложенных объектах Если ваш документ содержит вложенные объекты, вы можете использовать «точечную нотацию» для ссылки на вложенные поля в документе при вызове update ()

Это будет статично и приведет к

update({
'level1.level2.STATIC_KEY' : 'updatedValue'
});

Тогда я нашел ответ https://stackoverflow.com/a/47296152/5552695, который помог мне сделать динамический путь обновления.Требуемое решение после этого может выглядеть как

field[`level1.level2.${DYNAMIC_KEY}`] = updateValue;
update(field);

Но все же: оно удалит другие поля в этом пути.

ОБНОВЛЕНИЕ:

Структура моего документа выглядит следующим образом: Snapshot

Поэтому внутри этой структуры я хочу обновить только complexArray> 0> innerObject> age

Запись указанного выше пути в метод update () удалит все остальное на уровне complexArray.Простое обновление полей первого уровня работает нормально и позволяет другим полям первого уровня оставаться неизменными.

Возможно ли, что функции хранилища данных, такие как update (), могут действовать только на самом низком уровне поля вдокумент.И как только я помещаю сложные объекты в документ, невозможно выбрать такие внутренние поля?Я знаю, что было бы решение выделить эти "сложные" объекты в отдельные коллекции + документы и поместить их в мой текущий самый низкий уровень документа.Я думаю, что это был бы более точный способ придерживаться принципов FireStore.Но на стороне приложения легче работать со сложным объектом, чем всегда копаться глубже в коллекции firestore + структура документа.

Поэтому мое текущее решение - отправить весь сложный объект в метод update (), даже если ятолько что изменил только одно поле на стороне приложения.

1 Ответ

0 голосов
/ 02 ноября 2018

Вы пытались использовать опцию { merge: true } в своем запросе?

db
  .collection("myCollection")
  .doc("myDoc")
  .set(
    { 
      level1: { level2: { myField: "myValue" } }
    },
    { merge: true }
  )
...