从firebase数据库中删除项

从firebase数据库中删除项,firebase,firebase-realtime-database,ionic3,angularfire2,Firebase,Firebase Realtime Database,Ionic3,Angularfire2,我在firebase中有一个餐厅书签列表,但我不知道如何删除数据库中的特定餐厅 因此,我有一个函数unfavorite(favorite),其中我将最喜欢的餐厅作为参数传递。在此之前,我希望将此参数id传递给查询,以便从数据库中删除,如下所示: this.afDb.list(`bookmarks/${user.uid}/restaurant/${favorite.restaurant.id})`).remove(); "bookmarks": { "$user_id": { //

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

因此,我有一个函数
unfavorite(favorite)
,其中我将最喜欢的餐厅作为参数传递。在此之前,我希望将此参数id传递给查询,以便从数据库中删除,如下所示:

this.afDb.list(`bookmarks/${user.uid}/restaurant/${favorite.restaurant.id})`).remove();
"bookmarks": {
  "$user_id": {
    // normal reads and write rules here
  },
  ".indexOn": ["id"]
以下是我的数据库列表的屏幕截图:


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

您首先需要在数据库中添加
“.indexOn”:[“id”]
规则,如下所示:

this.afDb.list(`bookmarks/${user.uid}/restaurant/${favorite.restaurant.id})`).remove();
"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提供的任何类型的“排序”方法,您就可以使用它的任何变体

方法2 当我写这篇文章的时候,我完全浏览了一下你的餐厅地图的能力,比如:

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

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

您首先需要向数据库中添加一条
“.indexOn”:[“id”]
规则,如下所示:

this.afDb.list(`bookmarks/${user.uid}/restaurant/${favorite.restaurant.id})`).remove();
"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提供的任何类型的“排序”方法,您就可以使用它的任何变体

方法2 当我写这篇文章的时候,我完全浏览了一下你的餐厅地图的能力,比如:

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

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

我不确定你问的是什么,目前你的代码缺少一些部分,因为我可以看到有两个自动生成的键,但你只在书签后列出一个,但要稍微具体一点,以便我能理解下面的问题。bookmarks/user.uid/AutogeneratedKey这是它现在的存储方式好的,所以你问,“我如何删除它?”“自动生成密钥”密钥节点当我知道其中的“id”(子节点)时?“是:)这正是我要问的我不确定你要问什么,目前,您的代码缺少一些部分,因为我可以看到它有两个自动生成的键,但您只在书签后列出一个,但要稍微具体一点,这样我才能理解下面的问题。bookmarks/user.uid/AutogeneratedKey这就是它现在的存储方式好的,所以您会问,“我如何删除那个”AutogeneratedKey“关键节点当我知道其中的“id”(子节点)时?”是的:)这正是我要问的。因为我在脑海中写下了这一点,如果我写的内容出现错误,请告诉我(尽管不应该)所以我可以正确地编辑我的响应。谢谢你的回答,但是当我像你一样添加indexOn时,我说我永远不能为多个iple餐厅添加书签而只是删除一个?你会想循环查询匹配的子节点:
exampleRef.orderByChild('id').equalTo(theDeleteIDhere)。一次('value')。然后(snapshot=>{snapshot.forEach(restaurant=>{restaurant.ref.remove();}}})
明天会调查的,谢谢你的快速回复!完成了。但是即使只有一个结果,循环仍然是需要的。一个项目的列表,仍然是一个列表。因为我是在我的头上写下的,请告诉我我我写的内容是否会带来错误(尽管不应该)所以我可以正确地编辑我的响应。谢谢你的回答,但是当我像你一样添加indexOn时,我说我永远不能为多个iple餐厅添加书签而只是删除一个?你会想循环查询匹配的子节点:
exampleRef.orderByChild('id').equalTo(theDeleteIDhere)。一次('value')。然后(snapshot=>{snapshot.forEach(restaurant=>{restaurant.ref.remove();}}})
明天将查看它,感谢您的快速响应!完成。但即使只有一个结果,仍然需要循环。一个项目的列表仍然是一个列表。