一尘不染

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

json

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

让我们使用以下数据:

我的资料

我正在使用set()写入数据。现在,我希望用户对其进行编辑bookTitle,并且需要在两个地方都进行更改。我尝试使用update(),但似乎无法正常工作。我只能在bookTitle中编辑bookInfoNOT books。

移动不是一种选择,因为它会删除bookData。我也尝试使用push()进行编写,但是之后,由于我没有
pushID ,因此无法正确搜索(我需要搜索,因为用户不能拥有两本同名的书)

那么,有没有办法更新键值?还是有更好的方法呢?我接受建议。谢谢!

更新:这是我目前用来更新内部书名的内容bookInfo

var bookName = document.getElementById('bookName').value;

firebase.database().ref('books/' + bookName + '/bookInfo').update({
    bookTitle : bookName
});

阅读 279

收藏
2020-07-27

共1个答案

一尘不染

我想我明白了您要做什么。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。

警告:这取决于读取数据,然后执行第二次异步更新。如果您可能有多个用户同时操作同一数据,则可能会导致问题。您可以使用事务来自动执行此操作,但是如果它/books是具有许多节点的顶级资源,则可能会导致性能问题。

如果一个人可能一次编辑数据,则上述解决方案很好。如果不是,您可能要考虑使用非用户控制的标识符,例如推送ID。

2020-07-27