Как удалить конкретного ребенка из ребенка в Firebase

1

У меня есть приложение, в котором пользователь может создавать списки.

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

Это удаление будет производиться только владельцем списка.

Таким образом, сценарий будет:

  • Пользователь A создает список с pushID = 1.
  • Этот список добавляется в следующий firebase ref: /userList/$ userAID/$ pushID.
  • Список пользователей с пользователями B и пользователем C.
  • Этот список добавляется в следующий firebase ref: /userList/$ userBID/$ pushID и /userList/$ userCID/$ pushID.
  • Пользователь A удаляет список с pushID = 1.

Так что в моем

Итак, у меня есть эта схема:

userList: {
   2xYnKcZFEdPYWfUJ3E63yQEDShe2: {
     -Kt7lXiY0Yt-oDcV38L5
   }
   KtQHkXMSwKSByZ1rmTRwjDmSYnE3: {
     -Kt7lXiY0Yt-oDcV38L5: {}
     -Kt9XP91hjwcwgcBSgbc: {}
   }
   XHpMVoRqcCdzwTP70L29Lza1ibD3: {
     -Kt7lXiY0Yt-oDcV38L5: {}
   }
}

На высоком уровне это будет:

userList: {
       userID: (A) {
         -listID : (1) {}
       }
       userID: (B) {
         -listID: (1) {}
         -listID: (2) {}
       }
       userID: (C) {
         -listID: (1) {}
         -listID: (3) {}
         -listID: (4) {}
       }
    }

Текущий код, который я должен сделать, следующий:

const ref = firebase.database().ref('userList');
    ref.once('value')
      .then((snapshot) => {
        snapshot.forEach((childSnapshot) => {
          ref.child(childSnapshot.key)
            .once('value')
            .then((snapshot2) => {
              snapshot2.forEach((childSnapshot2) => {
                if (childSnapshot2.key === uid) {
                  ref.child(childSnapshot2.key)
                    .remove();
                }
              });
            })
            .catch(() => {
              console.log('error2');
            });
        });
      })
      .catch((error) => {
        console.log(error);
      });

То, что я делаю в этом коде, - это сначала выбор ВСЕГО списка внутри userList, путем получения ключа, которому я могу перейти к дочернию userID. Внутри этого узла еще раз я могу прыгать внутри pushID, где я делаю проверку проверки того, равен ли текущий ключ UID списка, который я хочу удалить, если это так, я делаю remove().

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

  • 0
    Я ищу что-то вроде: firebase.database (). Ref ('userList'). Child (). Child (uid) .remove (); Я знаю, что child () не может быть пустым. Но что-то подобное
Теги:
firebase
firebase-realtime-database

1 ответ

4
Лучший ответ

Невозможно выполнить удаление нескольких элементов на стороне сервера на основе состояния с базой данных Firebase. Сначала вы должны получить элементы (или только их идентификаторы), соответствующие условию, а затем удалить их.

Однако вы можете удалить сам список и все ссылки на него за один раз, используя обновление с несколькими путями.

Я также рекомендую хранить список всех UID, с которыми вы поделились определенным списком, так что вам не нужно перебирать всех пользователей. Удержание отношений "многие ко многим" в обоих направлениях довольно распространено в Firebase и других базах данных NoSQL.

Подробнее см.

  • 0
    Да, в конце я думаю, что лучшим способом будет вести учет всех пользователей, которым был предоставлен список, и с этим циклом удалить. Но что, по вашему мнению, является наилучшей практикой ... использование обновления milti-path или наличие списка всех пользователей, с которыми вы делитесь, а затем цикл?
  • 0
    Они обычно идут рука об руку: вы читаете список местоположений / ключей из базы данных, циклически просматриваете его, чтобы создать коллекцию путей для обновления, а затем запускаете одно обновление для нескольких местоположений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню