Как вставить в существующий массив БД Firebase, используя функции Firebase в JavaScript - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать приложение, которое хранит и показывает цитаты книг по названию и по автору. Я использую Firebase для бэкэнда. Моя структура данных Firebase выглядит следующим образом.

enter image description here

Когда добавляется цитата из книги, я знаю автора. Поэтому, чтобы автоматически сохранить цитату автора, я пытаюсь использовать функции Firebase.

Я пробовал два подхода,

Слияние цитат автора с цитатами из книги при обновлении книги.

exports.newQuotesTrigger = functions.database.ref('library/{bookAndAuthor}').onWrite((snap, context) => {
    const message = snap;
    console.log('Retrieved message content: ', message);

    const newValue = message.after.val();
    const oldValue = message.before.val();

    const author = snakeCase(newValue.author);
    admin.database().ref('authors/' + author).child('quotes').set(newValue.quotes);
    console.log('Updated author quotes');

    return message;
});

Просто вставьте разницу новых цитат и старых цитат из книги

exports.newQuotesTrigger = functions.database.ref('library/{bookAndAuthor}').onWrite((snap, context) => {
    const message = snap;
    console.log('Retrieved message content: ', message);

    const newValue = message.after.val();
    const oldValue = message.before.val();

    const newQuotes = newValue.quotes || [];
    const oldQuotes = oldValue.quotes || [];
    const diff = arrayDiff(newQuotes, oldQuotes);

    if (diff) {
        console.log('Quotes were updated for ', {title: newValue.title, author: newValue.author});
        const author = snakeCase(newValue.author);
        admin.database().ref('authors/' + author).child('quotes').push(diff);
        console.log('Updated author quotes');
    }

    return message;
});

Оба не добавляют / вставляют обновления цитаты должным образом. Я не нашел способ добавить / вставить в массив базы данных Firebase.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы должны использовать update для «обновления определенных дочерних узлов без перезаписи других дочерних узлов», см .:

https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

Ваш первый фрагмент кода должен работать с обновлением, если вы немного измените свою структуру, как следует с автоматически сгенерированными идентификаторами для кавычек

База данных

author
    - nassim
      - quoteID1: "...."  <- ID auto generated
      - quoteID2: "...."  <- ID auto generated
      - quoteID3: "...."  <- ID auto generated

Облачная функция

Замените в первой версии кода эти строки

    admin.database().ref('authors/' + author).child('quotes').set(newValue.quotes);
    console.log('Updated author quotes');
    return message;

этими

  const quotesObject = newValue.quotes;
  var updates = {};      

  Object.keys(quotesObject).forEach(function (key) {
    let quote = quotesObject[key];
    const newQuoteKey = firebase.database().ref('authors/' + author).child('quotes').push().key;
    updates[newQuoteKey] = quote ;
  });

  return admin.database().ref('authors/' + author).child('quotes').update(updates);

Другим важным моментом является то, что вы не возвращаете обещание в своих облачных функциях. Вы должны вернуть обещание из обновления (или установить), а не сообщение. См https://www.youtube.com/watch?v=652XeeKNHSk&t=26s


В случае, если вам действительно нужно сохранить идентификатор кавычек, сгенерированный вами (т.е. 0, 1, 2 и т. Д.) В последовательности, вам придется манипулировать массивами, получая предыдущий массив значений, добавляя новую кавычку и перезаписывая существующий набор цитат с новым массивом .. много усилий! тем более, что с автоматически генерируемыми идентификаторами вы не потеряете порядок цитат: они все равно будут сохранены в том порядке, в котором они были написаны.

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