Firestore Обновить отдельный элемент в поле массива - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть документ в Firebase Firestore, похожий на приведенный ниже. Суть в том, что у меня есть массив с именем items с объектами внутри него:

{
 name: 'Foo',
 items: [
   {
     name: 'Bar',
     meta: {
        image: 'xyz.png',
        description: 'hello world'
     }
   },
   {
     name: 'Rawr',
     meta: {
        image: 'abc.png',
        description: 'hello tom'
     }
   }
 ]
}

Я пытаюсь обновить поле внутри массива элементов под мета-объектом. Например items [0] .meta.description из hello world в hello bar

Сначала я попытался сделать это:

  const key = `items.${this.state.index}.meta.description`
  const property = `hello bar`;

  this.design.update({
    [key]: property
  })
  .then(() => {
    console.log("done")
  })
  .catch(function(error) {
    message.error(error.message);
  });

Это, похоже, не сработало, поскольку удалило все в индексе элемента, который я хотел изменить, и просто сохранило описание под мета-объектом

Сейчас я пробую следующее, которое в основном переписывает весь мета-объект с новыми данными

  const key = `items.${this.state.index}.meta`
  const property = e.target.value;
  let meta = this.state.meta;
  meta[e.target.id] = property;

  this.design.update({
    [key]: meta
  })
  .then(() => {
    this.setState({
    [key]: meta
    })
  })
  .catch(function(error) {
    message.error(error.message);
  });

К сожалению, это, кажется, превращает весь мой массив элементов в объект, который выглядит примерно так:

{
 name: 'Foo',
 items: {

   0: {
     name: 'Bar',
     meta: {
        image: 'xyz.png',
        description: 'hello world'
     }
   },
   1: {
     name: 'Rawr',
     meta: {
        image: 'abc.png',
        description: 'hello tom'
     }
   }
 }
}

Есть идеи, как мне просто обновить контент, который я хочу?

1 Ответ

0 голосов
/ 05 сентября 2018

Firestore не имеет возможности обновить существующий элемент в индексированном массиве. Ваши единственные параметры массива для обновлений описаны в документации - вы можете добавить новый элемент в массив ("arrayUnion") или удалить элемент ("arrayRemove").

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

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