Как вставить данные в Firebase с помощью Polymerfire (несколько узлов + несколько путей)

Мой случай использования, что у меня есть <iron-form> с одним <paper-textarea> поле, которое принимает строковый список адресов электронной почты, которые я анализирую в массив, тогда я хочу:

  1. Сохраните отдельные адреса электронной почты в моем Firebase (для целей индексации и поиска),
  2. в нескольких местах (для каждого метода разветвления данных),
  3. с одной операцией записи (потому что я не хочу делать 100 вызовов API, если список такой длинный) и
  4. без перезаписи любых существующих данных.

В частности, я хочу начать с состояния A, а именно:

Состояние А
my-app
 |
 - emails
 |  |
 |  - email1@example,com
 |     |- old: "data"
 |  - email2@example,com
 |     |- old: "data"
 - users
    |
    - c0djhbQi6vc4YMB-fDgJ

И достичь состояния B следующим образом:

Состояние B
my-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"} не перезаписывается

Фон

Я стремлюсь расширить этот ТАК вопрос и ответ.

Там мы вставили один узел в новое место с тремя вариантами:

  1. с помощью firebase-query
  2. JS SDK
  3. с помощью firebase-document

Теперь мне нужно сделать один и тот же тип вставки (без удаления или замены старых данных) для нескольких узлов (с определенным пользователем, а не сгенерированным ключом, т. Е. Ключи - это конкретные адреса электронной почты). Мне также нужно использовать метод разветвления данных для обновления нескольких путей с помощью одной операции записи.

Подобно тому, что показано здесь.

https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
function 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 поддерживает произвольно сложные атомные глубокие обновления ( запись в блоге). Это работает так:

  1. Вы можете обновить любой произвольно глубокий путь с помощью одного .update() вызов
  2. Полный путь на ключевой стороне карты обновлений будет заменен, поэтому вы должны обращаться непосредственно к подразделам, если не хотите удалять родительский элемент.
  3. Пути относительно вашей текущей ссылки

Итак, давайте возьмем ваш пример:

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);

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

Другие вопросы по тегам