Функция Firebase Cloud обновляет все записи в базе данных - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть куча комментариев в базе данных Firebase, и я хочу сделать некоторые обновления для комментариев через облачную функцию (это упрощенный пример, я буду делать некоторую логику, которая требует облачной функции).

Что мне нужно сделать, так это просмотреть все комментарии в базе данных, настроить узел рейтинга и затем обновить базу данных с помощью скорректированных комментариев.

Я потратил много времени на изучение этого, но яЯ совершенно новичок в облачных функциях, так что мне очень трудно понять это.Я предполагаю, что хочу сохранить все изменения для всех комментариев (их может быть тысячи) в массиве или объекте, а затем выполнить обновление за один раз вместо каждого комментария отдельно?

Кстати, этокод не работает, я предполагаю, что массив и возврат совершенно неверны.

exports.increaseRating = functions.database.ref('/comments/')
    .onUpdate((snapshot) => {   

        var updates = [];

        snapshot.before.forEach((element) => {
            var comment = element.val();
            comment.rating += 1000;
            updates.push(comment);
        });

        return updates;
    })

Код, который я использую для обновления одной записи.Мне нужно сделать одно и то же для всех комментариев одновременно.

exports.increaseRating = functions.database.ref('/comments/{commentId}')
    .onUpdate((snapshot, context) => {

        const comment = snapshot.before.val();
        const newRating = comment.rating += 1000;       

        const now = new Date().getTime();
        if (comment.lastUpdate) {
            if (comment.lastUpdate > now - (30 * 1000)) {
                return null;
            }
        }

        return admin.database().ref(`/comments/${context.params.commentId}`).update({
            "rating": newRating,
            "lastUpdate": now
        })
    })

1 Ответ

0 голосов
/ 21 сентября 2018

Если вы хотите обновить все дочерние узлы, вы можете сделать что-то вроде этого:

var ref = firebase.database().ref("comments"); // or admin.database().ref("comments")
ref.once("value").then((snapshot) => {
  var updates = {};
  snapshot.forEach((commentSnapshot => {
    var comment = commentSnapshot.val();
    var newRating = comment.rating + 1000;
    updates[commentSnapshot.key+"/rating"] = newRating;
  });
  ref.update(updates);
})

При этом выполняется одно обновление нескольких местоположений для всех комментариев.Обратите внимание, что выигрыш в производительности по сравнению с выполнением отдельных обновлений довольно мал, поскольку Firebase передает несколько запросов по одному соединению .

Также обратите внимание, что вы должны не поставить этов облачных функциях запускается на /comments, так как это приведет к бесконечному циклу: каждый раз, когда комментарии пишутся, ваша функция запускает, что обновляет комментарии, что снова вызывает функцию.

Если вам нужнов облачных функциях вы захотите использовать функцию, запускаемую по протоколу HTTP, которая вызывается HTTP-вызовами вместо записи в базу данных.

exports.updateCommentRatings = functions.https.onRequest((req, res) => {
  var ref = admin.database().ref("comments")
  ref.once("value").then((snapshot) => {
    var updates = {};
    snapshot.forEach((commentSnapshot => {
      var comment = commentSnapshot.val();
      var newRating = comment.rating + 1000;
      updates[commentSnapshot.key+"/rating"] = newRating;
    });
    ref.update(updates).then(() => {
      res.status(200).send("Comment ratings updated");
    });
  })
})

Затем можно периодически вызывать этот URL / функцию с помощью такой службы, какcron-job.org.Подробнее об этом см. Облачные функции для запуска по Firebase вовремя? .

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