Облачная функция Firebase для подсчета и обновления коллекций - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть три коллекции в моем проекте Firebase, одна содержит местоположения, из которых пользователи зарегистрировались, а две другие предназначены для размещения таблиц лидеров с городами и пригородами с наибольшим количеством проверок.

Однако, как немного новые базы данных ie NO SQL, я не совсем уверен, как выполнять запросы, которые мне нужны, чтобы получить и установить нужные мне данные.

В настоящее время моя коллекция checkins имеет эта структура:

{ Suburb:,
City:,
Leaderboard:}

Запись в таблице лидеров является логическим значением для отметки, если регистрация уже была добавлена ​​в таблицу лидеров.

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

exports.updateLeaderboard = functions.pubsub.schedule('30 * * * *').onRun(async context => {
    db.collection('Bears')
    .where('Leaderboard', '==', 'false')
    .get()
    .then(snap =>{
        snap.forEach(x => {
            //Count unique cities and return object SELECT cities,COUNT(*) AS `count` FROM Bears GROUP BY cities
        })
    })
    .then(() => {
        console.log({result: 'success'});
    })
    .catch(error => {
        console.error(error);
    });
})

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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

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

Например, если вы хотите подсчитать все упоминания о городе, вы должны сохранить это считать во время события.

// On document create
await firestore()
  .collection("city-count")
  .doc(doc.city)
  .set({
    count: firebase.firestore.FieldValue.increment(1),
  }, { merge: true });

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

Редактировать: Вот как Firebase решил эту проблему именно с точки зрения SQL обученный разработчик https://www.youtube.com/watch?v=vKqXSZLLnHA

0 голосов
/ 08 апреля 2020

Как поясняется в этом другом сообщении сообщества здесь , Firestore не имеет встроенного API для подсчета документов по запросу . Вам нужно будет прочитать всю коллекцию и загрузить ее в переменную, а затем поработать с данными, посчитав, сколько из них имеют False в качестве значений в своем Leaderboard документе. При этом вы можете начать добавлять эти города и пригороды в массивы, которые после будут записаны в базу данных, обновляя две другие коллекции.

Пример кода ниже - непроверенный - возвращает значения из базы данных, где Leaderboard равен null, увеличивают число и показывают, куда нужно скопировать значения City и Suburb в другие коллекции. Я в основном изменил некоторые порядки ваших кодов и изменил переменные на generi c, для лучшего понимания, добавив комментарий о том, куда добавить копию значений в другие коллекции.

...
// Create a reference to the collection of checkin
let checkinRef = db.collection('cities');

// Create a query against the collection
let queryRef = checkinRef.where('Leaderboard', '==', false);

var count = 0;

queryRef.get().
    .then(snap =>{
        snap.forEach(x => {
           //add the cities and suburbs to their collections here and update the counter
           count++;
        })
    })
...

Вы очень близки к решению, просто сейчас нужно скопировать значения из одной коллекции в другие, как только у вас все они будут иметь False в списке лидеров. Вы можете получить несколько хороших примеров копирования документов из коллекции в другую, в этом другом посте сообщества: Облачные функции: как скопировать коллекцию Firestore в новый документ?

Позвольте мне знать, помогла ли вам информация!

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