Счетчики приращений узла и ВСЕХ родителей, использующие облачные функции БД в реальном времени от firebase - PullRequest
4 голосов
/ 26 марта 2019

Я пишу облачные функции для моей базы данных реального времени Firebase (не Firestore), используя js sdk.Эти функции увеличивают счетчики, которые подсчитывают количество пользователей на область.Области, которые я использую, являются географическими и вложенными (континент> страна> регион> город).Функции запускаются путем вставки пользователя в список пользователей данной области (.onCreate).Если пользователь будет добавлен в список пользователей, скажем, страны, он будет автоматически добавлен в список пользователей на родительском континенте.

После некоторого перебора я смог только "низкоуровневое «немасштабируемое решение» (которое, кстати, работает).Это означает, что мне нужно написать дополнительный код, например, если я хочу добавить дочернюю область в город.

Это проблема, потому что я ожидаю добавить дочерние области в будущем.

Вопрос: Есть ли способ написать общую облачную функцию, которая увеличивает счетчики узла и счетчики всех его родительских узлов?

Я совершенно новичок в firebase, и любая помощь будет очень признательна

Структура JSON FireBase в реальном времени, дБ.

{
  "groups" : {
    "location" : {
      "continents" : {
        "EU" : {
          "countries" : {
            "DE" : {
              "created" : "2019-03-25--20:03:34",
              "flag" : "/flags/de.svg",
              "label" : "Germany",
              "level" : 2,
              "regions" : {
                "BE" : {
                  "cities" : {
                    "Berlin" : {
                      "created" : "2019-03-25--20:03:35",
                      "label" : "Berlin",
                      "level" : 3,
                      "type" : "location",
                      "usercount" : 1,
                      "users" : {
                        "rvDUa5n0oufRFGA9JB7lioom0ac2" : {
                          "created" : "2019-03-25--20:03:55",
                          "label" : "Anonymous"
                        }
                      }
                    }
                  },
                  "created" : "2019-03-25--20:03:35",
                  "label" : "Land Berlin",
                  "level" : 3,
                  "type" : "location",
                  "usercount" : 1,
                  "users" : {
                    "rvDUa5n0oufRFGA9JB7lioom0ac2" : {
                      "created" : "2019-03-25--20:03:52",
                      "label" : "Anonymous"
                    }
                  }
                }
              },
              "type" : "location",
              "usercount" : 1,
              "users" : {
                "rvDUa5n0oufRFGA9JB7lioom0ac2" : {
                  "created" : "2019-03-25--20:03:49",
                  "label" : "Anonymous"
                }
              }
            }
          },
          "created" : "2019-03-25--20:03:33",
          "label" : "Europe",
          "level" : 1,
          "type" : "location",
          "usercount" : 1,
          "users" : {
            "rvDUa5n0oufRFGA9JB7lioom0ac2" : {
              "created" : "2019-03-25--20:03:46",
              "label" : "Anonymous"
            }
          }
        }
      }
    }
  }
}

Мои облачные функции для вставки пользователя - все еще нужно написать для удаления пользователя

exports.onUserAddToContinent = functions.database
.ref('/groups/location/continents/{continentID}/users/{userID}')
.onCreate((snapshot, context) => {

const continentId = context.params.continentID
const counterRef = admin.database().ref('/groups/location/continents/' + continentId + '/usercount');

return counterRef.transaction(usercount => {
  return (usercount || 0) + 1
  })
})

exports.onUserAddToCountry = functions.database
.ref('/groups/location/continents/{continentID}/countries/{countryID}/users/{userID}')
.onCreate((snapshot, context) => {

    const continentId = context.params.continentID
    const countryId = context.params.countryID
    const counterRef = admin.database().ref('/groups/location/continents/' + continentId + '/countries/' + countryId + '/usercount');

    return counterRef.transaction(usercount => {
      return (usercount || 0) + 1
      })
})

exports.onUserAddToRegion = functions.database
.ref('/groups/location/continents/{continentID}/countries/{countryID}/regions/{regionID}/users/{userID}')
.onCreate((snapshot, context) => {

    const continentId = context.params.continentID
    const countryId = context.params.countryID
    const regionId = context.params.regionID
    const counterRef = admin.database().ref('/groups/location/continents/' + continentId + '/countries/' + countryId + '/regions/' + regionId +'/usercount');

    return counterRef.transaction(usercount => {
      return (usercount || 0) + 1
      })
})

exports.onUserAddToCity = functions.database
.ref('/groups/location/continents/{continentID}/countries/{countryID}/regions/{regionID}/cities/{cityID}/users/{userID}')
.onCreate((snapshot, context) => {

    const continentId = context.params.continentID
    const countryId = context.params.countryID
    const regionId = context.params.regionID
    const cityId = context.params.cityID
    const counterRef = admin.database().ref('/groups/location/continents/' + continentId + '/countries/' + countryId + '/regions/' + regionId +'/cities/'+ cityId + '/usercount');

    return counterRef.transaction(usercount => {
      return (usercount || 0) + 1
      })
})

Я чувствую, что что-то упустил.Должен быть общий способ сделать это.

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