Обновление подколлекций в CloudFunctions - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужна помощь с чем-то.

У меня есть 2 коллекции в моем проекте, одна называется «Продукты», а другая - «Пользователи».

Я дублирую информацию о выбранном продукте в подпрограмму. коллекция пользователей в качестве избранного, в данном случае:

пользователи (коллекция)> пользователь (документ)> избранное (коллекция)> продукт (документ)

Моя идея заключается в создании облачной функциион будет следить за любыми обновлениями любого продукта в разделе «коллекция продуктов» product (collection)> product (doc), а затем отражать эти изменения в подколлекции «пользователи> избранное», обновляя значения продуктов здесь:

пользователи (коллекция)> пользователь (документ)> избранное (коллекция)> продукт (документ)

Как это возможно из index.js? Это мой код:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

    exports.updateFavoritedProducts = functions.firestore.document('products/{productId}').onUpdate((change, context) => {

admin.firestore().collection('products').get(queryProductsSnapshot => {

    queryProductsSnapshot.forEach(productQuery => {
    const pricePQ = productQuery.price;

    console.log('tetesfsf');

    return admin.firestore().collection('users').get(queryUsersSnapshot => {
            queryUsersSnapshot.forEach(userSnapshot => {

                return admin.firestore().collection('users').doc(userSnapshot.id).collection('favorites').get(queryUserProductsSnapshot => {
                    queryUserProductsSnapshot.forEach(queryUserProductSnapshot => {
                        if (queryUserProductSnapshot.id === productQuery.id) {

                            return admin.firestore().doc(`users/${userSnapshot.id}/favorites/${queryUserProductSnapshot.id}`).update({ amountVolume: '123456'
                            })
                        } else {
                            console.log("No events found");
                            return null
                        }
                    })
                });
            })
            })
    });
})
});

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Я наконец-то понял, как это сделать с помощью вложенных обещаний. Вот решение:

exports.updateFavoritedProducts = functions.firestore.document('products/{productId}').onUpdate((change, context) => {
    const data = change.after.data();
    const productID = data.id;

 return db.collection('products').where('id', '==', productID).get().then((productsQuerySnap) => {

    productsQuerySnap.forEach((productQuerySnap) => {
        const newPrice = productQuerySnap.data().price;
        const newPriceUnit = productQuerySnap.data().priceUnit;

        db.collection('users').get().then((usersQuerySnap) => {
            usersQuerySnap.forEach((userQuerySnap) => {

                return db.collection('users').doc(userQuerySnap.id).collection('favorites').doc(productQuerySnap.id).update({ 
                    price: newPrice,
                    priceUnit : newPriceUnit

                 }).catch((err) => {
                    console.log('Error getting documents', err);
                    return Promise.reject(err);
                    });
                });
                return null
            })
            .catch((err) => {
                console.log('Error getting documents', err);
                return Promise.reject(err);
            });
        return null
    });
    return null
})
    .catch((err) => {
        console.log('Error getting documents', err);
        return Promise.reject(err);
    });
});
0 голосов
/ 01 ноября 2019

Если вы хотите создать облачную функцию, которая запускается во всех обновлениях продукта для всех пользователей, вы объявляете ее как:

functions.firestore.document('users/{userId}/products/{productId}').onUpdate((change, context) => {

Если затем вы хотите получить доступ к userId или productId внутритело функции, вы можете получить их как:

context.params.userId
context.params.productId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...