Облачная функция Firebase не обновляет запись - PullRequest
0 голосов
/ 15 ноября 2018

представьте себе такой сценарий:

У вас есть список, скажем, 100 элементов, пользователь выбирает из списка 12 элементов.

Теперь пользователь хочет, чтобы эти 12 элементов отображались в новом списке с актуальными данными (если данные изменяются из исходного списка / узла)

Каков наилучший способ сделать это без необходимости денормализовать все данные для каждого элемента?

есть ли способ заказатьByChild (). EqualTo ( несколько элементов )

( несколько предметов являются привилегированными предметами)

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

примечание - эти изменения вносятся вручную в БД и не могут быть изменены пользователем (метаданные, которые могут измениться)


UPDATE

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

Вот мой код:

exports.itemUpdate = functions.database
  .ref('/items/{itemId}')
  .onUpdate((change, context) => {

  const before = change.before.val();  // DataSnapshot after the change
  const after = change.after.val();  // DataSnapshot after the change

  console.log(after);

  if (before.effects === after.effects) {
    console.log('effects didnt change')
    return null;
  }
   const ref = admin.database().ref('users')
   .orderByChild('likedItems')
   .equalTo(before.title);

   return ref.update(after);
});

Я не уверен, что я делаю здесь неправильно.

Ура!

1 Ответ

0 голосов
/ 15 ноября 2018

Нет способа сделать несколько элементов в orderByChild, денормализация в NoSQL хороша только для того, чтобы поддерживать синхронизацию, как вы упомянули.Я бы порекомендовал использовать облачную функцию , которая поможет вам поддерживать синхронизацию.

Другой вариант - использовать Firestore вместо базы данных реального времени, так как она имеет лучшие возможности запросов, где вы можете хранитьидентификатор пользователя в документе и использование массива содержит фильтр, который вы можете получить все сообщения пользователей.

Ниже приведен запуск функции Cloud для триггера базы данных в реальном времени для обновления элемента.

exports.itemUpdate = functions.database.ref('/items/{itemId}')
    .onUpdate((snap, context) => {
        // Query your users node for matching items and update them
    });
...