我有一个firestore集合,需要根据对象数组中的数据进行更新,起初这不是问题。但随着数据的增长,要将数据更新到firebase,我们必须比较每个id,然后对所有数据执行更新。
这里有一些数组,
let newCategoriesUpdate = [
{
category_id: 100001,
parent_category_id: 0,
name: "Health",
isActive: true,
has_children: true,
},
{
category_id: 100019,
parent_category_id: 100001,
name: "Medical Equipment",
isActive: true,
has_children: false,
},
{
category_id: 100020,
parent_category_id: 100001,
name: "Laboratory",
isActive: false,
has_children: false,
},
]
该列表包含超过200个对象,这些对象需要在每个循环上进行比较,这花费更多的时间和存储器。
下面是我在firebase中实现的更新上面对象数组中的集合的方法
const handleUpdateCategories = () => {
db.collection("category")
.get()
.then((snapshot) => {
snapshot.forEach((docRef) => {
let name = "My Category";
if (docRef.data().name === name) {
let categoryRef = docRef.id;
db.collection("category")
.doc(categoryRef)
.collection("categoryList")
.get()
.then((snapshotCollection) => {
// loop collection from firebase
snapshotCollection.forEach((catListDocRef) => {
let categoryListRefId = catListDocRef.id;
// need to compare each loop in array
// loop array to update
newCategoriesUpdate.map((category) => {
if (
catListDocRef.data().categoryId === category.category_id
) {
db.collection("category")
.doc(categoryRef)
.collection("categoryList")
.doc(categoryListRefId)
.set(
{
categoryId: category.category_id,
isActive: category.isActive,
categoryName: category.name,
},
{ merge: true }
)
.then(() => {
console.log("UPDATE Success");
})
.catch((err) => {
console.log("ERR", err);
});
}
});
});
});
}
});
});
};
这个方法起作用,并且在控制台中还多次显示"UPDATE Success"消息。
是否有更好的替代方法来更新对象数组中的多个集合?
2条答案
按热度按时间uqjltbpv1#
这是一种浪费:
您正在从
category
检索所有文档,然后只处理名称为"My Category"
的文档。如果存在其他名称的文档,则应使用查询只检索需要处理的文档:可能还有更多的事情,但这是第一个跳出来的我。
enxuqcxy2#
这项工作可以在服务器端通过侦听Categories集合的云函数
onWrite
触发器来完成。同时考虑更有效地组织数据,您是否可以将子类别存储在父类别中,以便准确地知道哪些文档需要更新?