Облачные функции получают список из пути к хранилищу - PullRequest
0 голосов
/ 04 августа 2020

У меня есть эта архитектура в моем хранилище: test1 / {test1ID} / test2 /

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

My цель - обновить документ test1ID, в котором обновляются данные, со значением [0] th + [1] th + [2] th документ в подколлекции test2.

Но с приведенным ниже кодом я получаю документ test2 list (currentTest2DocumentList) undefined.

(сообщение об ошибке => TypeError: невозможно прочитать свойство '0' of undefined)

Как я могу получить действительный список документов в подколлекции?

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

admin.initializeApp();

exports.onItemDocumentUpdate = functions.firestore.document('test1/{test1ID}')
.onUpdate(async (change, context) => {

const currentTest1ID = context.params.test1ID


const currentTest2DocumentList = await 
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(function(docs) {return docs.forEach(function (doc){doc.data()})})

const addedValue = currentTest2DocumentList[0].field1 + currentTest2DocumentList[1].field1 + 
currentTest2DocumentList[2].field1

return admin.firestore().collection('test1').doc(currentTest1ID).update({testField: 
addedValue});

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Похоже, вы неправильно используете forEach. Попробуйте следующее:

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(function(docs) {
  let res = []
  docs.forEach(doc => res.push(doc.data()));
  return res;
})

Или еще лучше:

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').get()
.then(docs => docs.map(doc => doc.data()));

У вас более трех документов в коллекции test2? Потому что читать их все - пустая трата времени. Вы можете добавить limit(3), чтобы исправить это

const currentTest2DocumentList = await
admin.firestore().collection('test1').doc(currentTest1ID).collection('test2').limit(3).get()
.then(docs => docs.map(doc => doc.data()));
0 голосов
/ 04 августа 2020

Причина, по которой он возвращает undefined, заключается в том, что функция forEach не возвращает никаких значений. Попробуйте получить доступ к полю docs снимка коллекции и использовать функцию карты javascript следующим образом:

// IMPORT
const functions = require('firebase-functions');
const admin = require('firebase-admin');

// INIT
admin.initializeApp();

// LISTEN TO UPDATES
exports.onItemDocumentUpdate = functions.firestore.document('test1/{test1ID}').onUpdate(async (change, context) => {
    // GETS PARAMS
    const currentTest1ID = context.params.test1ID

    // READ THE COLLECTION
    const currentTest2DocumentList = await admin.firestore().collection('test1/' + currentTest1ID + '/test2').get().then(function(collectionSnapShot) {
        return collectionSnapShot.docs.map(function (doc){
            return doc.data();
        })
    })

    // GETS THE SUM USING THE REDUCE METHOD.
    const addedValue = currentTest2DocumentList.reduce((x,y)=>{
        return x + y.field1;
    }, 0);

    // UPDATES TEST.
    return admin.firestore().collection('test1').doc(currentTest1ID).update({testField: 
        addedValue
    });
})

Могу я также предложить использовать решение для увеличения и уменьшения, например , поэтому в моем ответе уменьшить количество прочитанных документов? Это значительно сэкономит вам на ежемесячных счетах.

0 голосов
/ 04 августа 2020

Эта строка кода делает не то, что вы ожидаете:

const currentTest1ID = context.params.ID

Я предлагаю вести журнал currentTest1ID. Он будет неопределенным. Это потому, что context.params содержит только ключи, отмеченные символами подстановки в пути к документу. У вас нет подстановочного знака под названием «ID». Возможно, это то, что вы хотите:

const currentTest1ID = context.params.test1ID

Обратите внимание, что test1ID соответствует подстановочному знаку, который вы определили в пути к функции.

...