Пакет Firebase Firestore фиксирует: выполняются ли инструкции пакета в указанном порядке? - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над подобной / непохожей системой сообщений, основанной на Firestore и Cloud Functions. В настоящее время я настраиваю облачную функцию, которая будет выполняться, когда пользователь приложения просматривает список сообщений. Цель этой облачной функции - подсчитать количество лайков каждого поста, суммировать количество лайков каждого поста одного и того же владельца поста и сохранить в базе данных количество лайков всех постов каждого владельца поста в владельца поста. document.

Итак:

  1. Я перебираю все документы моих пользователей и устанавливаю количество лайков всех их сообщений равным 0. Это инициализация. Я использую пакетные обновления.

  2. Затем я перебираю все лайки. В оперативной памяти для каждого владельца сообщения я вычисляю сумму количества лайков каждого из созданных им сообщений. Я использую JS операций с массивами.

  3. Затем я перебираю массив 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.');
    });

});

1 Ответ

2 голосов
/ 15 апреля 2020

Пакеты и транзакции завершаются одновременно, атомарно или не завершаются вовсе. Там нет порядка. Если вы установите значение поля дважды, то вступит в силу только последнее значение, указанное при создании пакета.

Если вы спрашиваете о триггерах Cloud Functions, которые могут произойти в ответ на обновление документа, для этих триггеров гарантия заказа отсутствует.

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