2016-08-23 45 views
4

我想知道,有沒有辦法更新關鍵值?是否可以重命名Firebase實時數據庫中的某個鍵?

Let's使用下面的數據:

my data

我使用set()來寫入數據。 現在,我希望用戶編輯它們的bookTitle,並且它需要在兩個地方都進行更改。我嘗試使用update(),但我似乎無法使它工作。我只能編輯中的bookTitle而不是books

移動不是一個選項,因爲它會擦除bookData。 我也嘗試使用推()編寫,但然後,我無法正確搜索,因爲我沒有pushID(我需要搜索,因爲用戶不能有兩本同名的書)

因此,有沒有辦法更新鍵值? 或者,有沒有更好的方法呢?我接受建議。謝謝!

更新:這是I'm目前使用更新內部bookInfo

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

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

我在解析描述時遇到問題。你能包括你嘗試過的代碼嗎?這對我來說可能更容易解析。 –

+0

這是不是已經在這裏回答了?:http://stackoverflow.com/questions/29115990/firebase-update-key – davidtaubmann

回答

13

我想我明白你想要做什麼。 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。

+0

示例中的根只是一個分數。整個數據庫的結構是'root/writers//books/bookTitle/bookInfo>'所以,只有一個用戶會編輯信息。非常感謝你。 –

0

有一件事值得一提的書名是什麼,你可以抓住從推()函數的唯一關鍵。

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

來源:Firebase Docs - push()

我無法從你的截圖告訴那裏的bookTitle第二個實例(是的截圖根元素?),但是如果你不希望使用push(),您可以抓取該位置的數據,remove(),然後再次撥打set(),這次是更新後的書名。例如:

var bookRef = firebaseRef.database().ref('path/to/books/book1'); 

bookRef.on('value', function(snapshot) { 
    var bookData = snapshot.val(); 
    var newData = {}; 
    var newTitle = 'NewTitle'; 

    bookData.bookInfo.bookTitle = newTitle; 
    newData[newTitle] = bookData; 
    firebaseRef.database().ref('path/to/books/' + newTitle).set(newData); 

}); 
+0

是的。它在根。所以,幾乎將'book1'中的所有信息移動到一個名爲'NewTitle'的新小孩吧? –

+0

我會這麼認爲,是的。那對你有用嗎? – ZenPylon

+0

啊,同樣,你以後需要'bookRef.remove()'來擺脫舊的引用。 – ZenPylon

0

我仍然會使用push(),這真的是將多個子對象存儲在Firebase的category-node下的正確方法。對於搜索,你有沒有想過在客戶端做這件事?例如,您可以將所有圖書對象保存在圖書節點下,並在需要時檢索要在本地進行搜索的圖書。

同樣作爲ZenPylon提到的,push()爲您提供了一個唯一的id,您也可以將其作爲一個道具分配給每個書對象,這樣每本書都有一個存儲在數據庫中的參考。

相關問題