Swift 基于“更新云Firestore集合”;主收藏“;

Swift 基于“更新云Firestore集合”;主收藏“;,swift,google-cloud-firestore,Swift,Google Cloud Firestore,我正在创建一个iOS应用程序,帮助收集雕像的用户跟踪他们的雕像并查看实时价格信息 我有两个收藏: “大师”系列 这本质上是一个目录,用户可以选择添加到他们的收藏数以千计的雕像。它有关于每个项目的信息,如艺术家、原价、条形码、年份、评论等 “用户”集合 其中包含每个用户的文档。每个“用户”文档都有一个子集合,其中包含他们添加到集合中的每个雕像的文档 当前,如果用户希望将新项目添加到其个人收藏中,他们将转到“主”收藏UITableView并滑动以添加项目。项目文档基本上是从“主”集合复制的,

我正在创建一个iOS应用程序,帮助收集雕像的用户跟踪他们的雕像并查看实时价格信息

我有两个收藏:

  • “大师”系列

    • 这本质上是一个目录,用户可以选择添加到他们的收藏数以千计的雕像。它有关于每个项目的信息,如艺术家、原价、条形码、年份、评论等
  • “用户”集合

    • 其中包含每个用户的文档。每个“用户”文档都有一个子集合,其中包含他们添加到集合中的每个雕像的文档
  • 当前,如果用户希望将新项目添加到其个人收藏中,他们将转到“主”收藏UITableView并滑动以添加项目。项目文档基本上是从“主”集合复制的,并且在用户子集合中创建了一个新文档。然后,他们可以转到UITableView,其中显示他们添加的项目。他们可以选择添加自己关于物品的信息,如评论、购买日期、出售日期、购买价格等

    我的问题:如何在用户集合/子集合中的文档和主集合中的文档之间同步信息?假设一件物品的“市场价格”上涨了,所以我更新了主收藏数据库。如何使此价格变化显示在所有用户的集合中


    我假设使用云函数,但我想在这里发布,以防有更简单的方法。

    这绝对是云函数的一个很好的用途。为
    /users{uid}/figurines/{figurineId}
    集合创建一个onUpdate触发器,然后使用该触发器将更新的数据复制到主数据

    您可以复制特定字段,也可以通过检查
    event.data.data()
    event.data.previous.data()


    很乐意帮忙。此解决方案不允许将更新后的价格复制回集合中具有特定雕像的每个用户。因此,如果我更改了主集合(.document('figurines/figurineId})中雕像的marketPrice字段,是否有一种方便的方法来更新每个用户集合(.document)中的“marketPrice”字段('users/{uid}/figurines/{figurineId})?我将大约每年发布四次更新,更新大约10000个雕像的价格。基本上,我更感兴趣的是相反的操作。我想将信息从主人发送到每个用户的雕像文档。目前无法更新不同父文档的几个子集合。这是一项要求的功能,因此我们可能会在将来的某个时候看到它。我可以想到的两种解决方案是a)不在用户雕像文档中包含可更改的信息,并始终从母版或b)获取这些信息创建一个云函数来获取所有用户,然后对每个用户进行迭代,检查他们的Figure子集合。后一种解决方案不具有广泛的可扩展性,具体取决于用户数量。云函数在2分钟后超时。我理解。我希望在某个时候引入此功能。无法包含更改不幸的是,用户的小雕像文档中的可编辑信息不是一个选项。我想我也可以提出两个拉取请求(一个来自主机,一个来自收集器的小雕像文档)以显示在视图上,但这似乎效率不高。您描述的第二个解决方案可能有效,因为我希望每季度更新一次。
    const admin = require('firebase-admin');
    const functions = require('firebase-functions');
    
    admin.initializeApp(functions.config().firebase);
    
    const db = admin.firestore();
    
    exports.updateMaster = functions.firestore
      .document('users/{uid}/figurines/{figurineId}')
      .onUpdate(event => {
        var newData = event.data.data();
        var oldData = event.data.previous.data();
        var updateData = {};
    
        if (oldData.price != newData.price) {updateData.price = newData.price}
        // Add any more changes that you may want to compare / update below...
    
        // Then...
        return db
          .collection('master')
          .doc(event.params.figurineId)
          .update(updateData).then(response => {
    
          console.log('We updated figurine', event.params.figurineId);
        }).catch(err => {
          console.error('There was an error', err);
        });
    });