我想知道,有没有办法更新密钥值?
让我们使用以下数据:
我正在使用set()来写入数据。
现在,我希望用户编辑他们的\ProvidesPackage{sty/prettythesis}
,并且需要在两个地方进行更改。我尝试使用update()但似乎无法使其工作。我只能在bookTitle
上编辑bookTitle
中的bookInfo
。
移动不是一种选择,因为它会删除books
。
我也尝试使用push()编写,但后来,我无法正常搜索,因为我没有pushID(我需要搜索,因为用户不能拥有两本同名书籍)
那么,有没有办法更新键值? 或者,有更好的方法吗?我接受建议。谢谢!
更新:这是我目前用于更新bookData
bookInfo
答案 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;
我无法从您的屏幕截图中了解bookTitle
的第二个实例(它是屏幕截图中的根元素吗?),但如果您不想使用{{1您可以抓取该位置的数据push()
,然后再次调用remove()
,这次使用更新的书名。类似的东西:
set()
答案 2 :(得分:0)
我仍然会使用push(),我认为这是在firebase中的类别节点下存储多个子对象的正确方法。对于搜索,你有没有想过在客户端这样做?例如,您可以将所有图书对象保存在books节点下,并在需要时检索那些在本地搜索的图书对象。
同样如ZenPylon所述,push()为您提供了一个唯一的ID,您也可以将其指定为每个书籍对象的道具,以便每本书都可以参考数据库中存储的位置。
答案 3 :(得分:0)
答案 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);
});
});
}