如何添加到 Angular Firestore 中的数组?

How do I add to an array in Angular Firestore?

我正在尝试使用 Angular Fire 2 将 ID 添加到我的用户集合中以在 Firestore 中进行访问控制。

 grantCompanyAccess (user, companyId) {
    try {
      const userAccess: AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
      return userAccess.set({companies: [companyId]});
    } catch (error) {
      console.log(error);
    }
  }

  removeCompanyAccess (user, companyId) {
    try {
      const userAccess: AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
      const userData = {
        companies:  [{companyId}]
      };
      // return userAccess.collection('companies').doc(companyId).delete();
      return userAccess.collection('companies').doc(companyId).delete();
    } catch (error) {
      console.log(error);
    }
  }

目前授权方法正在替换数组中的id。如果该值不存在({merge: true} 不起作用)如何添加到数组并使用 remove 方法从数组中删除。

您应该首先从 firebase 获取数组,然后将您的新 ID 推送到该数组。 之后,您可以使用更新后的数组设置公司。

我认为标记为已接受的答案是错误的。我知道 OP 问 'in Angular Firestore' 但建议的答案为 OP 提供了会伤害他的解决方案,我认为这不好。

如果您有不止一个可以更新数据的来源(例如应用程序的少数用户),您迟早会丢失数据。接受的答案不能解决并发问题。

想象一下这个场景:

  1. 用户 A 获取他想要更新的数据和数组,如下所示: [1,2,3]

  2. 用户 A 现在添加一个元素 (4) -> [1,2,3,4](尚未发布到服务器)

  3. 用户 B 现在获取相同的数据(数组看起来像这样 [1,2,3]

  4. 用户 A 现在发布到服务器(服务器上的新数据看起来像这样 [1,2,3,4]

  5. 用户 B puhes 一个元素 (5) 到他本地的数组,现在看起来像这样 [1,2,3,5]。他现在推送到服务器。

  6. 服务器上的效果数据被覆盖,服务器保持[1,2,3,5]

  7. 结果 (4) 用户 A 在步骤 2 中推送的值现在从数组中丢失。

您想要做的事情的实际解决方案是使用 Firestore Cloud Function,您可以在其中使用 ArrayUnion 方法。然后通过 HTTP 或可调用端点公开该函数,而不是在您的应用程序中使用 if。 不要使用 AngularFirestore 这样做,因为目前它没有提供足够的解决方案。

希望对你有帮助,干杯

不需要云函数,使用arrayUnion:

var washingtonRef = db.collection("cities").doc("DC");

// Atomically add a new region to the "regions" array field.
washingtonRef.update({
    regions: firebase.firestore.FieldValue.arrayUnion("greater_virginia")
});

// Atomically remove a region from the "regions" array field.
washingtonRef.update({
    regions: firebase.firestore.FieldValue.arrayRemove("east_coast")
});

以上来自 Pepe: https://firebase.google.com/docs/firestore/manage-data/add-data#web-v8_11

链接的文档