如何添加到 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 提供了会伤害他的解决方案,我认为这不好。
如果您有不止一个可以更新数据的来源(例如应用程序的少数用户),您迟早会丢失数据。接受的答案不能解决并发问题。
想象一下这个场景:
用户 A 获取他想要更新的数据和数组,如下所示:
[1,2,3]
用户 A 现在添加一个元素 (4)
-> [1,2,3,4]
(尚未发布到服务器)
用户 B 现在获取相同的数据(数组看起来像这样 [1,2,3]
)
用户 A 现在发布到服务器(服务器上的新数据看起来像这样 [1,2,3,4]
用户 B puhes 一个元素 (5)
到他本地的数组,现在看起来像这样 [1,2,3,5]
。他现在推送到服务器。
服务器上的效果数据被覆盖,服务器保持[1,2,3,5]
结果 (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
链接的文档
我正在尝试使用 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 提供了会伤害他的解决方案,我认为这不好。
如果您有不止一个可以更新数据的来源(例如应用程序的少数用户),您迟早会丢失数据。接受的答案不能解决并发问题。
想象一下这个场景:
用户 A 获取他想要更新的数据和数组,如下所示:
[1,2,3]
用户 A 现在添加一个元素
(4)
->[1,2,3,4]
(尚未发布到服务器)用户 B 现在获取相同的数据(数组看起来像这样
[1,2,3]
)用户 A 现在发布到服务器(服务器上的新数据看起来像这样
[1,2,3,4]
用户 B puhes 一个元素
(5)
到他本地的数组,现在看起来像这样[1,2,3,5]
。他现在推送到服务器。服务器上的效果数据被覆盖,服务器保持
[1,2,3,5]
结果
(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
链接的文档