У меня есть эта очень грязная функция Firebase.
exports.getAverage = functions.firestore
.document('users/{userId}/days/{day}')
.onUpdate((snapshot, context) => {
let averages = {};
let temp = [];
let dayRefDoc = admin.firestore().collection(`users/${context.params.userId}/days`)
return dayRefDoc.get().then(inner => {
console.log(inner.docs);
for (doc of inner.docs) {
console.log(doc);
return doc.ref.collection('session').get().then(session => {
session.docs.forEach(doc => temp.push(parseInt(doc.data().duration)))
})
}
}).then(() => {
console.log(temp);
averages["sessionTime"] = (temp.reduce(function (a, b) { return a + b; }, 0)) / temp.length;
return admin.firestore().collection('users').doc(context.params.userId).get().then(inner => {
return inner.ref.update({ averageSessionTime: averages.sessionTime })
})
})
})
Идея в том, что каждый user
в моей базе данных имеет вложенную коллекцию days
, и каждый день имеет вложенную коллекцию, называемую session
. Я хочу go просмотреть каждый session
документ за все дни и подсчитать переменную с именем duration
, а затем получить среднее значение всех длительностей за все сеансы за все дни.
Получение среднего значения не Это сложно. Я борюсь с обещаниями прямо сейчас. В частности, получение функции для итерации по каждому подколлекции days
для конкретного пользователя. Мое решение сейчас работает для первого документа, по которому оно итерируется, но не извлекает следующий, предположительно, потому что doc.ref.collection('session').get().then()
само по себе обещание, и я выполняю возврат этого обещания, которое заставляет его выйти из строя. for (doc of inner.docs)
l oop.
Правильно ли я считаю, что это проблема? Я чувствую, что использование al oop для создания этих обещаний в любом случае является плохой идеей, так какова была бы предполагаемая практика для выполнения чего-то подобного?