我正在尝试使用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方法从数组中删除。
答案 0 :(得分:0)
您应该首先从Firebase获取阵列,然后将新ID推入该阵列。 之后,您可以使用更新后的阵列设置公司。
答案 1 :(得分:0)
我认为标记为已接受的答案是错误的。我知道OP要求“在Angular Firestore中”,但建议的答案为OP提供了会伤害他的解决方案,我认为这不好。
如果您拥有多个可以更新数据的源(例如,应用程序的少数用户),您迟早会丢失数据。接受的答案不能解决并发问题。
想象一下这种情况:
用户A获取要更新的数据和数组,如下所示:
[1,2,3]
用户A现在添加了一个元素(4)
-> [1,2,3,4]
(尚未发布到服务器)
用户B现在获取相同的数据(数组看起来像[1,2,3]
)
用户A现在发布到服务器(服务器上的新数据,看起来像[1,2,3,4]
用户B将一个元素(5)
推入他在本地拥有的数组,现在看起来像[1,2,3,5]
。现在,他推送到服务器。
由于效果,服务器上的数据被覆盖并且服务器保留[1,2,3,5]
用户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