如何删除firebase中的大型节点

时间:2015-11-26 20:47:34

标签: firebase

我有一个Firebase子节点,其中包含大约15,000,000个子对象,总大小约为8 GB。

例如数据结构:

firebase.com/childNode/$pushKey

each $pushKey contains a small flat dictionary: 
{a: 1.0, b: 2.0, c: 3.0}

我希望尽可能高效,轻松地删除这些数据。怎么样?

我试过的: 我的第一次尝试是一个看跌请求:

PUT firebase.com/childNode.json?auth=FIRE_SECRET
data-raw: null
  

回复:{       “错误”:“请求的数据超过了单个请求可以访问的最大大小。请联系support@firebase.com寻求帮助。”   }

所以这不起作用,让我们做一个限制请求:

PUT firebase.com/childNode.json?auth=FIRE_SECRET&orderBy="$key"&limitToFirst=100
data-raw: null
  

回复:{       “error”:“查询此请求类型不支持的相关参数”   }

到目前为止没有运气:(如何编写一个脚本,它将获得第一个X数量的键,然后创建一个补丁请求,每个值设置为null?

GET firebase.com/childNode.json?auth=FIRE_SECRET&shallow=true&orderBy="$key"&limitToLast=100
  

{     “错误”:“不支持混合'浅'和查询参数”   }

这个真的不容易吗?我可以删除浅层需求并获取密钥,然后完成脚本。我只是希望有一种更容易/更有效的方式???

我尝试的另一件事是创建一个侦听childAdded的节点脚本,然后直接尝试删除这些子节点?

ref.authWithCustomToken(AUTH_TOKEN, function(error, authData) {
  if (error) {console.log("Login Failed!", error)}
  if (!error) {console.log("Login Succeeded!", authData)}

  ref.child("childNode").on("child_added", function(snap) {
    console.log(`found: ${snap.key()}`)
    ref.child("childNode").child(snap.key()).remove( function(err) {
      if (!err) {console.log(`deleted: ${snap.key()}`)}
    })
  })
})

这个脚本现在实际挂起,但早些时候我确实收到了一些事情,比如来自firebase的最大堆栈限制警告。我知道这不是一个firebase问题,但我没有看到任何特别简单的方法来解决这个问题。

3 个答案:

答案 0 :(得分:1)

下载浅树,只会下载密钥。因此,您可以下载所有密钥,而不是要求服务器订购和限制。

然后您可以在客户端订购和限制它,并批量发送删除请求到Firebase。

您可以使用此脚本获取灵感:https://gist.github.com/wilhuff/b78e7391396e09f6c614

答案 1 :(得分:0)

使用firebase cli工具:firebase数据库:remove --project。

答案 2 :(得分:0)

在浏览器控制台中这是最快的方式

database.ref('data').limitToFirst(10000).once('value', snap => { var updates = {}; snap.forEach(snap => { updates[snap.key] = null; }); database.ref('data').update(updates); });