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

时间:2019-05-17 08:28:33

标签: angular firebase google-cloud-firestore angularfire2

我正在尝试使用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);
    }
  }

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

3 个答案:

答案 0 :(得分:0)

您应该首先从Firebase获取阵列,然后将新ID推入该阵列。 之后,您可以使用更新后的阵列设置公司。

答案 1 :(得分:0)

我认为标记为已接受的答案是错误的。我知道OP要求“在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将一个元素(5)推入他在本地拥有的数组,现在看起来像[1,2,3,5]。现在,他推送到服务器。

  6. 由于效果,服务器上的数据被覆盖并且服务器保留[1,2,3,5]

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

您想要做的实际解决方案是使用Firestore Cloud Function,您可以在其中使用ArrayUnion方法。然后通过HTTP或可调用的终结点公开该函数,然后从应用程序中使用。 请勿使用AngularFirestore进行此操作,因为它目前无法提供足够的解决方案。

希望有帮助,欢呼

答案 2 :(得分:0)

不需要云函数,使用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