Firestore中的批量交易更新期间的问题

时间:2019-06-10 15:01:00

标签: angular firebase google-cloud-firestore angular7

功能:

我有一个功能batchItemUpdate,它获取项目列表。每个项目都有一个名为batchs的数组。我正在更新项目列表中每个项目的批次。由于可能有很多项目我正在使用批量写入方式,因此。检查以下代码:

batchItemUpdate(items: Item[]) {

    var transactionBatch = this.afs.firestore.batch();

    items.forEach((item)=>{
        const sfDocRef = this.afs.firestore.collection('items').doc(item.id);
        transactionBatch.update(sfDocRef,
            {
                batches:item.batches
            });
    });
    return transactionBatch.commit();
}

问题: 事务已成功提交,但仅写入了最新的批次数组。 item中批次数组中的所有其他批次都将被删除。

if previously item.batches was [1,2,3,4]
to be updated with [1,2,3,5]
now item.batches is [5]

1 个答案:

答案 0 :(得分:0)

当您使用值更新文档中的字段时,它将完全覆盖该字段的先前内容。不管它是什么类型,它都是一个“更新”这一事实不会将新值合并到该字段中(看起来像是将其设置为数组)。

如果要无条件地将值添加到数组,则可以:

  1. 读取文档,更改内存中的字段值,然后将其写回以完成文档。
  2. 或者,使用FieldValue.arrayUnion()添加值。一次只能使用一个值,因此您必须重复使用它。

您可能不得不放弃使用批处理的想法,除非您真的需要所有写入操作才能同时生效。那是批处理的主要用例。