Как вставить данные в Firebase с помощью Polymerfire (несколько узлов + несколько путей)
Мой случай использования, что у меня есть <iron-form>
с одним <paper-textarea>
поле, которое принимает строковый список адресов электронной почты, которые я анализирую в массив, тогда я хочу:
- Сохраните отдельные адреса электронной почты в моем Firebase (для целей индексации и поиска),
- в нескольких местах (для каждого метода разветвления данных),
- с одной операцией записи (потому что я не хочу делать 100 вызовов API, если список такой длинный) и
- без перезаписи любых существующих данных.
В частности, я хочу начать с состояния A, а именно:
Состояние Аmy-app
|
- emails
| |
| - email1@example,com
| |- old: "data"
| - email2@example,com
| |- old: "data"
- users
|
- c0djhbQi6vc4YMB-fDgJ
И достичь состояния B следующим образом:
Состояние Bmy-app
|
- emails
| |
| - email1@example,com
| |- old: "data"
| - email2@example,com
| |- old: "data"
| - email3@example,com
| |- new: "data"
| - email4@example,com
| |- new: "data"
- users
|
- c0djhbQi6vc4YMB-fDgJ
|
- emails
|
- email3@example,com
|- new: "data"
- email4@example,com
|- new: "data"
Обратите внимание: {old: "data"}
не перезаписывается
Фон
Я стремлюсь расширить этот ТАК вопрос и ответ.
Там мы вставили один узел в новое место с тремя вариантами:
- с помощью
firebase-query
- JS SDK
- с помощью
firebase-document
Теперь мне нужно сделать один и тот же тип вставки (без удаления или замены старых данных) для нескольких узлов (с определенным пользователем, а не сгенерированным ключом, т. Е. Ключи - это конкретные адреса электронной почты). Мне также нужно использовать метод разветвления данных для обновления нескольких путей с помощью одной операции записи.
Подобно тому, что показано здесь.
https://firebase.google.com/docs/database/web/read-and-write#update_specific_fieldsfunction writeNewPost(uid, username, picture, title, body) {
// A post entry.
var postData = {
author: username,
uid: uid,
body: body,
title: title,
starCount: 0,
authorPic: picture
};
// Get a key for a new Post.
var newPostKey = firebase.database().ref().child('posts').push().key;
// * * * * * * * * * * * * * * * *
// THE ABOVE LINE NEEDS TO CHANGE TO SUPPORT USER-GENERATED KEYS SUCH AS EMAIL ADDRESSES
// * * * * * * * * * * * * * * * *
// Write the new post's data simultaneously in the posts list and the user's post list.
var updates = {};
updates['/posts/' + newPostKey] = postData;
updates['/user-posts/' + uid + '/' + newPostKey] = postData;
return firebase.database().ref().update(updates);
}
Также обратите внимание, что в одном из комментариев упоминается:
Нет никаких причин
newPostKey
выше не может быть адрес электронной почты...
Проблема в том, что мне нужно написать несколько ключей одновременно в нескольких местах за один вызов.
1 ответ
База данных Firebase Realtime поддерживает произвольно сложные атомные глубокие обновления ( запись в блоге). Это работает так:
- Вы можете обновить любой произвольно глубокий путь с помощью одного
.update()
вызов - Полный путь на ключевой стороне карты обновлений будет заменен, поэтому вы должны обращаться непосредственно к подразделам, если не хотите удалять родительский элемент.
- Пути относительно вашей текущей ссылки
Итак, давайте возьмем ваш пример:
var update = {};
update['emails/email3@example,com'] = {new: 'data'};
update['emails/email4@example,com'] = {new: 'data'};
update['users/c0djhbQi6vc4YMB-fDgJ/emails/email3@example,com'] = {new: 'data'};
update['users/c0djhbQi6vc4YMB-fDgJ/emails/email4@example,com'] = {new: 'data'};
firebase.database().ref().update(update);
Это обновит все местоположения одновременно. Чтобы сделать его динамическим, просто используйте строковую интерполяцию при построении ключей.