是否可以重命名Firebase实时数据库中的密钥?

时间:2016-08-23 17:21:33

标签: javascript json firebase firebase-realtime-database

我想知道,有没有办法更新密钥值?

让我们使用以下数据:

my data

我正在使用set()来写入数据。 现在,我希望用户编辑他们的\ProvidesPackage{sty/prettythesis} ,并且需要在两个地方进行更改。我尝试使用update()但似乎无法使其工作。我只能在bookTitle上编辑bookTitle中的bookInfo

移动不是一种选择,因为它会删除books。 我也尝试使用push()编写,但后来,我无法正常搜索,因为我没有pushID(我需要搜索,因为用户不能拥有两本同名书籍)

那么,有没有办法更新键值? 或者,有更好的方法吗?我接受建议。谢谢!

更新:这是我目前用于更新bookData

内的图书标题的内容
bookInfo

5 个答案:

答案 0 :(得分:18)

我想我明白了你要做的事情。 Firebase没有"重命名"的概念。通过更新的路径的一部分。相反,您必须完全删除现有节点并重新创建它。你可以这样做:

var booksRef = firebase.database().ref('books');
booksRef.child(oldTitle).once('value').then(function(snap) {
  var data = snap.val();
  data.bookInfo.bookTitle = newTitle;
  var update = {};
  update[oldTitle] = null;
  update[newTitle] = data;
  return booksRef.update(update);
});

这将从books/oldTitle中移除信息,并使用books/newTitle中的新标题重新填充该信息。

警告:这依赖于读取数据然后执行第二次异步更新。如果您可能有多个用户同时对同一数据进行操作,则可能会导致问题。您可以使用transaction以原子方式执行此操作,但如果/books是具有许多可能导致性能问题的节点的顶级资源。

如果一个人可能一次编辑数据,上述解决方案就可以了。如果没有,您可能需要考虑使用非用户控制的标识符,例如推送ID。

答案 1 :(得分:0)

值得注意的是,您可以从push()函数中获取唯一键。

var booksRef = firebaseRef.database().ref('books');
var newBookRef = booksRef.push(myBookData);
var bookKey = newBookRef.key;

来源:Firebase Docs - push()

我无法从您的屏幕截图中了解bookTitle的第二个实例(它是屏幕截图中的根元素吗?),但如果您不想使用{{1您可以抓取该位置的数据push(),然后再次调用remove(),这次使用更新的书名。类似的东西:

set()

答案 2 :(得分:0)

我仍然会使用push(),我认为这是在firebase中的类别节点下存储多个子对象的正确方法。对于搜索,你有没有想过在客户端这样做?例如,您可以将所有图书对象保存在books节点下,并在需要时检索那些在本地搜索的图书对象。

同样如ZenPylon所述,push()为您提供了一个唯一的ID,您也可以将其指定为每个书籍对象的道具,以便每本书都可以参考数据库中存储的位置。

答案 3 :(得分:0)

您可以将所有数据库导出为JSON,在您喜欢的编辑器中将其重命名,通过控制台窗口右上方的import / export选项再次将其导入Firebase enter image description here

答案 4 :(得分:0)

我非常喜欢Michael Bleigh的答案,但...

在将键从一个级别移动到另一个级别时,这限制了我的深度范围,所以我最好使用此功能,甚至可以复制(0)或移动(1) 只需更改第三个参数即可完成密钥:

function mvFBkey(rtOrgn,rtDstn,rem){
  firebase.database().ref(rtOrgn).once('value').then(function(snap) {
    return firebase.database().ref(rtDstn).set(snap.val(),function(){
        if(rem)firebase.database().ref(rtOrgn).set(null);
    });
  });
}