基于“Master Collection”更新Cloud Firestore集合

时间:2018-02-02 15:14:43

标签: swift google-cloud-firestore

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

我有两个系列:

  1. “主”集合

    • 这实际上是用户可以选择添加到其馆藏中的数千个小雕像的目录。它包含有关每个项目的信息,例如艺术家,原始价格,条形码,年份,评论等。
  2. “用户”集合

    • 这包含每个用户的文档。这些“用户”文档中的每一个都有一个子集合,其中包含已添加到其集合中的每个小雕像的文档。
  3. 目前,如果用户想要将新项目添加到他们的个人收藏中,他们会转到“主”收藏集UITableView并滑动以添加项目。项目文档基本上是从“主”集合中复制的,并且创建了用户子集合中的新文档。然后,他们可以转到显示他们添加的项目的UITableView。他们可以选择添加自己的商品信息,例如评论,购买日期,销售日期,购买价格等。

    我的问题:如何在用户集合/子集合中的文档与主集合中的文档之间同步信息?说项目的“市场价格”已经上涨,所以我更新了主要的收集数据库。如何才能将此价格变化显示在所有用户的馆藏中?

    我假设使用云功能,但我想在此处发布,以防有​​更简单的方法。

1 个答案:

答案 0 :(得分:1)

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

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

来检查差异
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);
    });
});