Как удалить родительский ключ по его значению в firebase с помощью javascript

# #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:

Здесь есть две проблемы:

  1. Ваш запрос не соответствует узлам, которые вы хотите удалить.
  2. 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. Чтобы записать узел в базу данных, вам нужно знать весь путь к этому узлу.

Так что вам нужно будет:

  1. Выполните запрос a.
  2. Просмотрите результаты в коде вашего приложения.
  3. Удалите каждый соответствующий узел по отдельности или в многопутевом обновлении.

С учетом 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);
})