从firebase数据库中删除项
我在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": { //
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();}}})
明天将查看它,感谢您的快速响应!完成。但即使只有一个结果,仍然需要循环。一个项目的列表仍然是一个列表。