# #javascript #firebase #firebase-realtime-database
Вопрос:
Таким образом, я новичок в использовании базы данных firebase в реальном времени, и я не могу удалить дочерний ключ продукта с указанным идентификатором.
Я пробовал этот подход, но он не принес никакого успеха:
removeProductById = async (id, user) => {
const userProductRef = db.ref(`products/product`);
try{
var query = userProductRef.orderByChild('id').equalTo(id);
query.remove()
})
}catch(error){
console.log(`The error has occured ${error.message}`)
}
}
Поэтому я хочу знать, как можно удалить любой фрагмент ключа, какое бы значение они ни указывали. Заранее спасибо, вы всегда помогали мне, ребята.
Ответ №1:
Здесь есть две проблемы:
- Ваш запрос не соответствует узлам, которые вы хотите удалить.
- Firebase не поддерживает запросы на удаление.
Ваш запрос не соответствует узлам, которые вы хотите удалить
Ваш запрос начинается с узла products/product
, которого нет в вашей базе данных, а затем упорядочивает/фильтрует id
свойство каждого дочернего узла.
Вместо этого вы хотите начать с products
узла, а затем упорядочить/отфильтровать его product/id
свойство каждого дочернего узла:
В коде:
const userProductRef = db.ref(`products`);
var query = userProductRef.orderByChild('product/id').equalTo(id);
Не забывайте, что вам нужно будет определить индекс product/id
для этого на products
уровне ваших правил.
Firebase не поддерживает запросы на удаление
Вы не можете просто передать запрос и инструкцию по удалению в Firebase. Чтобы записать узел в базу данных, вам нужно знать весь путь к этому узлу.
Так что вам нужно будет:
- Выполните запрос a.
- Просмотрите результаты в коде вашего приложения.
- Удалите каждый соответствующий узел по отдельности или в многопутевом обновлении.
С учетом query
вышесказанного это было бы:
query.once("value").then((snapshot) => {
snapshot.forEach((child) => {
child.ref.remove();
});
})
Или с помощью многопутевого/пакетного обновления:
query.once("value").then((snapshot) => {
let updates = {};
snapshot.forEach((child) => {
updates[child.key] = null;
});
ref.update(updates);
})