【问题标题】:delete item out of firebase database从firebase数据库中删除项目
【发布时间】:2018-04-11 19:50:22
【问题描述】:

我的 Firebase 中有一个餐厅书签列表,但我不知道如何删除数据库中的特定餐厅。

所以我有函数unfavorite(favorite),我将最喜欢的餐厅作为参数传递。直到这里,我想将此参数 id 传递给查询以从数据库中删除,如下所示:

this.afDb.list(`bookmarks/${user.uid}/restaurant/${favorite.restaurant.id})`).remove();

这是我的数据库列表的截图:

如何从书签列表中删除该特定餐厅?

【问题讨论】:

  • 我不确定你的要求,目前你的代码缺少一些部分,因为我可以看到有两个自动生成的密钥,但你只在书签之后列出一个,但稍微具体一点,所以我可以理解您的问题如下。
  • bookmarks/user.uid/AutogeneratedKey 现在是这样存储的
  • 好的,你问的是,“当我知道其中的“id”(子)时,如何删除那个“AutogeneratedKey”关键节点?”
  • 是的 :) 这正是我要问的

标签: firebase firebase-realtime-database ionic3 angularfire2


【解决方案1】:

您首先需要将".indexOn": ["id"] 规则添加到您的数据库中,如下所示:

"bookmarks": {
  "$user_id": {
    // normal reads and write rules here
  },
  ".indexOn": ["id"]

这一步对于 firebase 数据库是必需的,否则您将无法使用 orderByChild()equalTo() 方法。

然后,在你有删除功能的地方,你想改用:

exampleRef = yourDb.ref("bookmarks/${user.uid}"); //this is just to simplify your reference a bit 
exampleRef.orderByChild('id').equalTo(theDeleteIDhere).once('value').then(snapshot => {
    snapshot.forEach((restaurant) => {
        restaurant.ref.remove();
    });
}); //this is a Promise that you can modify to return "true" if successful for example 

我提供的示例正是我之前所做的方式(即我更喜欢使用承诺;因此then() 因为这使得在角度服务中返回该承诺更容易,这使我可以检查请求是否那是成功的)。只要您有“indexOn”规则并且使用firebase 提供的任何“排序”方法here

,您就可以使用它的任何变体

方法二 当我写这篇文章时,我完全浏览了像这样映射你的餐厅的能力:

假设您的项目已经列出了这些餐厅。因此,您可以将每家餐厅的自动生成 id 保存到变量或地图中:

restaurants; // this is a map like this <your-identifier:autoID>

然后您可以轻松地调用:

exampleRef.child(restaurants[yourIdentifier]).remove();

【讨论】:

  • 因为我是在脑海中写下这个,如果我写的内容出现错误(尽管它不应该),请告诉我,以便我可以正确编辑我的回复。
  • 感谢您的回答,但是当我像您说的那样添加 indexOn 时,我永远无法为多家餐厅添加书签并删除其中一家?
  • 您需要遍历查询匹配的子节点:exampleRef.orderByChild('id').equalTo(theDeleteIDhere).once('value').then(snapshot =&gt; { snapshot.forEach(restaurant =&gt; { restaurant.ref.remove(); } })
  • 明天会调查,感谢您的快速回复!
  • 完成。但即使只有一个结果,循环仍然是需要的。一个项目的列表,仍然是一个列表。