云功能更新子集合

时间:2019-09-10 14:51:07

标签: firebase google-cloud-firestore google-cloud-functions

我正在尝试创建一个云函数,以在项目中的产品每次更新时触发。这是主意。

我有2个收藏集,商店产品

商店集合中,有一个名为产品的子集合,其中包含商店出售的所有产品。通过复制主要产品根集合中的特定项目来“获取数据” 我的想法是我的项目获得良好的性能和成本效益。

为此,我需要创建一个每次修改产品时都要触发的云函数,并查询所有具有相同产品ID 商店 >并更新数据。

我真的很难过。有人可以在这里为我照亮吗?这是我的云功能。

// Exporting the function
export const onProductChange = functions.firestore
.document('products/{productId}')
// Call the update method
.onUpdate(async (snap, context) => {
    // Get the product ID
    const productID = context.params.productID;
    // Query for all the collections with the specific product ID.
    const resultSnapshot = await db.collectionGroup('products')
        .where('id', '==', productID).get();

    // Filter for the collections with the 'products' root and return an array.
    const snaphotsInStoreSubcollection = resultSnapshot.docs.filter(
        (snapshot: any) => {
            return snapshot.ref.parent === 'products';
    });

    const batch = db.batch();
    // Takes each product and update
    snaphotsInStoreSubcollection.forEach((el: any) => {
        batch.set(el.ref, snaphotsInStoreSubcollection.product);
    });
    await batch.commit();
});

云功能控制台上的错误

  

错误:参数“值”的值不是有效的查询约束。不能使用“ undefined”作为Firestore值。在Object.validateUserInput(/srv/node_modules/@google-cloud/firestore/build/src/serializer.js:273:15)在validateQueryValue(/ srv / node_modules / @ google-cloud / firestore / build / src / reference)处。 js:1844:18)在Query.where(/srv/node_modules/@google-cloud/firestore/build/src/reference.js:956:9)在export.onProductChange.functions.firestore.document.onUpdate(/ srv /lib/product-update.js:29:10)位于cloudFunction(/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23)位于/worker/worker.js:825:24 process._tickDomainCallback(internal / process / next_tick.js:229:7)

2 个答案:

答案 0 :(得分:0)

我建议您看看此documentation,尤其是Event Triggers

让我知道这是否有帮助。

答案 1 :(得分:0)

我认为snapshotsInStoreSubcollection.product未定义

batch.set(el.ref, snaphotsInStoreSubcollection.product);

快照是一个文档,其数据是snapshot.data()

您无法在Firestore中将undefined设置为值,而您正在尝试