# #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), существует два метода:
- Прочитайте весь существующий массив, затем добавьте в него новые данные и, наконец, обновите документ измененным массивом. Очевидно, что это не масштабируемое решение, если вы ожидаете, что в массиве будет много элементов.
- Используйте метод 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! Я обновил свой ответ, чтобы включить пример для других, у которых может возникнуть аналогичный вопрос.