Firestore 更新数组字段中的单个项目

IT技术 javascript arrays firebase object google-cloud-firestore
2021-01-20 00:54:08

我在 Firebase Firestore 中有一个类似于下面的文档。这里的要点是我有一个数组items,里面有对象:

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

我正在尝试更新元对象下的 item 数组中的一个字段。例如 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);
  });

不幸的是,这似乎将我的整个 items 数组变成了一个看起来像这样的对象:

{
 name: 'Foo',
 items: {

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

有什么想法可以更新我想要的内容吗?

1个回答

Firestore 无法更新索引数组中的现有元素。文档中描述了您唯一的更新数组选项- 您可以向数组添加新元素(“arrayUnion”)或删除元素(“arrayRemove”)。

作为替代方案,您可以从文档中读取整个数组,在内存中对其进行修改,然后完全更新修改后的数组字段。

然后使用事务以原子方式读取和写入文档。 firebase.google.com/docs/firestore/manage-data/transactions
2021-03-26 00:54:08
“作为替代方案,您可以从文档中读取整个数组,在内存中对其进行修改,然后完全更新修改后的数组字段。” 如果其他用户在我的获取 - 修改 - 在服务器上更新之间及时更新了该数组的其他项目,它会不会更新我最初获取的旧数组,而我刚刚进行了更改?
2021-04-09 00:54:08