web-dev-qa-db-ja.com

Firebase Realtime Databaseでキーの名前を変更することはできますか?

キー値を更新する方法はありますか?

次のデータを使用してみましょう。

my data

Set()を使用してデータを書き込みます。ここで、ユーザーにbookTitleを編集してもらい、両方の場所で変更する必要があります。 update()を使用してみましたが、動作させることができません。 bookTitleではなく、bookInfoでのみbooksを編集できます。

bookDataを消去するため、移動はオプションではありません。また、Push()を使用して作成しようとしましたが、pushIDがないため、適切に検索できません(ユーザーは同じ名前の2冊の本を持てないため、検索が必要です)

それでは、キー値を更新する方法はありますか?または、これへのより良いアプローチがありますか?提案を受け入れます。ありがとうございました!

更新: これは、bookInfo内の本のタイトルを更新するために現在使用しているものです

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

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

私はあなたがやろうとしていることを見ると思う。 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に新しいタイトルが再入力されます。

警告:これは、データを読み取り、2回目の非同期更新を実行することに依存しています。複数のユーザーが同じデータを同時に操作している可能性が高い場合、問題が発生する可能性があります。 トランザクション を使用してこれをアトミックに実行できますが、/booksがパフォーマンスの問題を引き起こす可能性のある多くのノードを持つトップレベルのリソースである場合。

一度に1人のユーザーがデータを編集する可能性がある場合、上記の解決策で問題ありません。そうでない場合は、プッシュIDなどのユーザーが制御しない識別子の使用を検討することをお勧めします。

19
Michael Bleigh

とても気に入ったMichael Bleigh'sanswer BUT ...

キーを移動するときに深さの範囲を制限していました1つのレベルから別のレベルになので、duplicate(0)またはmove(1) = 3番目の引数を変更するだけで完全なキー:

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);
    });
  });
}
0
DavidTaubmann

私はまだPush()を使用します。これは、Firebaseのcategory-nodeの下に複数の子オブジェクトを格納するための本当に適切な方法です。検索のために、クライアント側でこれを行うことを考えましたか?たとえば、すべてのブックオブジェクトをブックノードの下に保存し、必要なときにそれらを取得してローカルで検索できます。

また、ZenPylonが述べたように、Push()は一意のIDを提供します。これは各ブックオブジェクトに小道具として割り当てることもできるため、各ブックはデータベース内の保存場所への参照を持ちます。

0
tetutato

注目に値することの1つは、Push()関数から一意のキーを取得できることです。

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

ソース: Firebase Docs-Push()

スクリーンショットからbookTitleの2番目のインスタンスがどこにあるかわかりません(スクリーンショットのルート要素ですか?)が、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
ZenPylon