База данных Firebase удаляет все узлы, равные определенному значению

1

У меня есть список пользователей, который содержит узел под названием scannedCards, который содержит массив cardIds. Ниже приведен снимок экрана одного пользователя.

Изображение 174551

Есть несколько пользователей, например, выше, я хочу удалить все идентификаторы карты, если они equalTo(Some Card Id), я хочу это со всеми пользователями одновременно.

Ниже приведен запрос, который я использую:

  const ref = database.ref('users');
  const query = ref.orderByChild('cardId').equalTo(cardId);

Но результат всегда пуст, может ли кто-нибудь рассказать, как я могу это достичь?

Теги:
firebase
react-native
firebase-realtime-database

1 ответ

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

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

Если вам нужно только сделать это как часть одноразовой операции, вы можете запустить что-то вроде этого:

const ref = database.ref('users');
ref.once('value').then(snapshot => {
  const users = snapshot.val();
  for (var user_id in users) {
    const scannedCards = users[user_id].scannedCards;
    for (var card in scannedCards) {
      if (scannedCards[card].card_id == "<some card id>") {
        firebase.database().ref('users/${user_id}/scannedCards/${card_id}')
        .set(null);
      }
    }
  }
});

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

// user_id is for whoever is logged in
const ref = firebase.database().ref('users/${user_id}/scannedCards');
ref.once('value').then(snapshot => {
  const scannedCards = snapshot.val();
  for (var card in scannedCards) {
    if (scannedCards[card].card_id == "<some card id>") {
      firebase.database().ref('users/${user_id}/scannedCards/${card_id}')
      .set(null)
    }
  }
});

Также стоит отметить, что scannedCards не является массивом идентификаторов карт, поскольку ключи являются идентификаторами объектов, а значениями являются объекты (которые содержат свойства cardId и userId).

  • 0
    Отличный ответ, Пэт! Другой альтернативой может быть добавление дополнительных данных, которые сопоставляют идентификатор карты с пользовательским узлом верхнего уровня. Например, "-L4ey...": "n5Id..." . С помощью этой структуры вы можете легко найти пользователя для данной карты, а затем удалить / обновить ее в обоих местах.
  • 0
    @FrankvanPuffelen, я думал об этом, но потом почувствовал, что это плохая практика, не так ли?
Показать ещё 1 комментарий

Ещё вопросы

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