Облачная функция Firebase пытается объединить данные пользователей в массив

# #javascript #firebase #react-native #merge #google-cloud-functions

Вопрос:

В настоящее время я работаю над собственным проектом React. Я создаю приложение с помощью Firebase. Давайте классифицируем это как приложение для социальных сетей.

Используя облачную функцию firebase, я пытаюсь объединить всех пользователей в один документ. Для этого, используя событие onCreate, я прослушиваю все новые документы, созданные в коллекции «пользователи», и каждый раз, когда создается новый пользователь, я беру всю его информацию и помещаю ее в другой документ в коллекции «агрегация». Предоставление этого дерева «агрегация/пользователи».

Вот мой код :

 exports.aggregateNewUsers = functions.firestore
    .document('users/{userId}')
    .onCreate( (snapshot, context) => {

        const newUser = snapshot.data()
const aggUsersRef = db.doc('aggregation/users')

        return aggUsersRef.set({
users: [newUser]} 
, {merge: true})

    })

 

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

Есть ли способ заставить это работать?

Спасибо, что уделили мне время!

Ответ №1:

Работа с массивами может быть сложной. Здесь «объединить» не означает «добавить«, это означает заменить (или добавить) значения для свойств, которые являются частью переданного объекта, и оставить остальную часть документа в покое. Поскольку вы передаете объект с существующим свойством (пользователи), значение этого свойства заменяется.

Чтобы добавить элемент в поле массива (в облачном магазине Firestore), существует два метода:

  1. Прочитайте весь существующий массив, затем добавьте в него новые данные и, наконец, обновите документ измененным массивом. Очевидно, что это не масштабируемое решение, если вы ожидаете, что в массиве будет много элементов.
  2. Используйте метод Firebase ArrayUnion
      aggUsersRef.update({
         users: firebase.firestore.FieldValue.arrayUnion(newUser)
     });
     

В соответствии с документацией Firebase Cloud Firestore:

«Если ваш документ содержит поле массива, вы можете использовать arrayUnion() и arrayRemove() для добавления и удаления элементов. arrayUnion() добавляет элементы в массив, но только те, которые еще не присутствуют. arrayRemove() удаляет все экземпляры каждого данного элемента.» https://firebase.google.com/docs/firestore/manage-data/add-data

Отредактировано, чтобы включить решение, найденное на плакате, для других читателей.

Комментарии:

1. Спасибо за вашу помощь ! На самом деле я искал лучшее решение вместо того, чтобы читать весь массив, потому что, как вы сказали, это не лучшее решение, зная, что в этом документе, как правило, будет много элементов. Я только что нашел решение, которое, кажется, работает. Используя новое решение Firebase «arrayUnion» и отправляя в него данные моего нового пользователя при каждом его создании. Мне все еще нужно было установить параметр слияния в значение true, чтобы он работал. С его помощью он правильно добавляет данные по мере их поступления и больше не заменяет их

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