Firebase Firestore,如何从对象数组中高效地更新多个集合

hc2pp10m  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(112)

我有一个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"消息。
是否有更好的替代方法来更新对象数组中的多个集合?

uqjltbpv

uqjltbpv1#

这是一种浪费:

db.collection("category")
  .get()
  .then((snapshot) => {
    snapshot.forEach((docRef) => {
      let name = "My Category";
      if (docRef.data().name === name) {
        ...

您正在从category检索所有文档,然后只处理名称为"My Category"的文档。如果存在其他名称的文档,则应使用查询只检索需要处理的文档:

db.collection("category")
  .where("name", "==", "My Category")
  .get()
  .then((snapshot) => {
    snapshot.forEach((docRef) => {
      ...

可能还有更多的事情,但这是第一个跳出来的我。

enxuqcxy

enxuqcxy2#

这项工作可以在服务器端通过侦听Categories集合的云函数onWrite触发器来完成。
同时考虑更有效地组织数据,您是否可以将子类别存储在父类别中,以便准确地知道哪些文档需要更新?

相关问题