Я работаю над подобной / непохожей системой сообщений, основанной на Firestore и Cloud Functions. В настоящее время я настраиваю облачную функцию, которая будет выполняться, когда пользователь приложения просматривает список сообщений. Цель этой облачной функции - подсчитать количество лайков каждого поста, суммировать количество лайков каждого поста одного и того же владельца поста и сохранить в базе данных количество лайков всех постов каждого владельца поста в владельца поста. document.
Итак:
Я перебираю все документы моих пользователей и устанавливаю количество лайков всех их сообщений равным 0. Это инициализация. Я использую пакетные обновления.
Затем я перебираю все лайки. В оперативной памяти для каждого владельца сообщения я вычисляю сумму количества лайков каждого из созданных им сообщений. Я использую JS операций с массивами.
Затем я перебираю массив JS, который содержит идентификатор владельцев сообщений, связанный с количеством лайков всех их сообщений, и Я установил в базе данных счетчик количества лайков всех их постов. Я использую пакетные обновления.
Если неясно, код доступен ниже.
Мой вопрос: так как я сначала инициализирую 0 счетчик всех моих пользователей документы, а затем я влияю на хорошее значение для счетчика некоторых из них, мне действительно нужно быть уверенным, что инициализация 0 выполняется до обновления остальных пакетов. Это так?
exports.sortUsersByUsersPostsLikes = functions.https.onCall((data, context) => {
if(!context.auth) {
throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
}
const batch = admin.firestore().batch();
const users = admin_firestore.collection('users');
const likes = admin_firestore.collection('likes_of_users_posts');
users.get().then(function(users_docs) {
users_docs.forEach(user_doc => {
batch.update(user_doc.ref, "number_of_likes_of_users_posts", 0);
});
return likes.get();
}).then(function(likes_docs) {
const map_users_id_with_number_of_likes = [];
likes_docs.forEach(like_doc => {
if(!(like_doc.data().post_owner in map_users_id_with_number_of_likes)) {
map_users_id_with_number_of_likes[like_doc.data().post_owner] = 0;
}
map_users_id_with_number_of_likes[like_doc.data().post_owner] += 1;
});
Object.keys(map_users_id_with_number_of_likes).forEach((k) => {
const user = admin_firestore.collection('users').doc(k);
batch.update(user, "number_of_likes_of_users_posts", map_users_id_with_number_of_likes[k]);
});
return batch.commit();
}).catch(function(error) {
console.log("UNABLE TO SORT THE USERS");
console.log(error);
throw new functions.https.HttpsError('unknown', 'An error occurred when trying to sort the users.');
});
});