如何在Firestore中更新数组内的对象?

10 浏览
0 Comments

如何在Firestore中更新数组内的对象?

我想更新Firestore中数组中一个对象的completed属性,但是我不知道如何找到数组中的特定元素。图片显示了结构。

enter image description here

我已经做到了这一步,但不知道如何选择数组中的特定元素,例如item 1。我想使用它的ID(它有一个id属性),但是不知道如何到达那里。

const businessRef = db.collection('approvedBusinesses').doc(businessId)
      try {
        businessRef.update({
          [`bookings.${currentDate} ????? `]: true // currentDate之后添加什么?
        })

顺便说一下,这是创建数组的方式(以及将其他对象推送到数组中的方式)

const bookingObj = {
      carro: 'PASSA_CARRO',
      completed: false,
      userId: userObject.uid,
    }
businessRef.update({
        [`bookings.${currentDate}`]: firebase.firestore.FieldValue.arrayUnion(bookingObj),
      })

0
0 Comments

问题的原因是Firestore没有提供直接更新数组中某个元素的操作。要更新数组中的元素,需要执行以下步骤:

1. 将整个文档读取到应用程序中。

2. 在应用程序代码中修改数组中的元素。

3. 将整个数组重新写回文档。

解决方法可以参考以下示例:

// 1. Read the document
const docRef = db.collection('yourCollection').doc('yourDocument');
docRef.get().then((doc) => {
  if (doc.exists) {
    // 2. Modify the item in the array
    const data = doc.data();
    data.yourArray[index] = newValue;
    // 3. Write back the entire array
    docRef.update({ yourArray: data.yourArray });
  }
});

这种方法可以更新数组中指定索引的元素。如果要更新多个元素,可以在应用程序中进行相应的修改。需要注意的是,这种方法会将整个数组读取到应用程序中,然后再写回文档,可能会导致读写的开销较大。

除了这种方法外,还可以考虑将数组存储在子集合中,这样可以解决“三步问题”,并且可以进行查询操作。但是需要注意的是,这种方法需要读写更多的文档,可能会增加开销。

在问题描述中还提到了一些相关的问题,可以参考这些问题来获取更多关于更新数组的方法。

0