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

Posted

技术标签:

【中文标题】Firestore 更新数组字段中的单个项目【英文标题】:Firestore Update single item in an array field 【发布时间】:2018-09-05 14:47:19 【问题描述】:

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


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

我正在尝试更新项目数组中元对象下的字段。例如从 hello world 到 hello bar 的 items[0].meta.description

最初我尝试这样做:

  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 无法更新索引数组中的现有元素。 documentation 中描述了用于更新的唯一数组选项 - 您可以向数组添加新元素(“arrayUnion”)或删除元素(“arrayRemove”)。

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

【讨论】:

"作为替代方案,您可以从文档中读取整个数组,在内存中对其进行修改,然后完全更新修改后的数组字段。"如果其他用户在我在服务器上的获取-修改-更新之间及时更新了该数组的其他项目,它不会用我刚刚所做的更改更新我最初获取的旧数组吗? 然后使用事务原子地读写文档。 firebase.google.com/docs/firestore/manage-data/transactions【参考方案2】:

您可以为该特定数组创建一个单独的集合,就像之前这张图片中的这样在数组里面。为此,我制作了不同的页面集合,每个页面的各个文档都具有可以改变的标题描述和内容的值。

【讨论】:

以上是关于Firestore 更新数组字段中的单个项目的主要内容,如果未能解决你的问题,请参考以下文章

Firebase firestore 从字段数组中删除项目

如何使用 iOS Swift 更新 firebase 中的单个数组元素?

Firestore 事务在单个事务中更新多个文档

渲染从 firebase firestore 获取的数组数据

Firestore 不合并特定的地图字段

更新 Firestore 中对象中的字段?