У меня есть список пользователей, который содержит узел под названием scannedCards
, который содержит массив cardIds
. Ниже приведен снимок экрана одного пользователя.
Есть несколько пользователей, например, выше, я хочу удалить все идентификаторы карты, если они equalTo(Some Card Id)
, я хочу это со всеми пользователями одновременно.
Ниже приведен запрос, который я использую:
const ref = database.ref('users');
const query = ref.orderByChild('cardId').equalTo(cardId);
Но результат всегда пуст, может ли кто-нибудь рассказать, как я могу это достичь?
Вышеупомянутый запрос, похоже, ничего не возвращает, потому что на основе предоставленного скриншота 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).
"-L4ey...": "n5Id..."
. С помощью этой структуры вы можете легко найти пользователя для данной карты, а затем удалить / обновить ее в обоих местах.