web-dev-qa-db-fra.com

Est-il possible de renommer une clé dans la base de données Firebase Realtime?

Je me demandais, est-il possible de mettre à jour la valeur clé?

Utilisons les données suivantes:

my data

J'utilise set () pour écrire les données. Maintenant, je veux que l'utilisateur modifie son bookTitle et il doit changer aux deux endroits. J'ai essayé d'utiliser update () mais je n'arrive pas à le faire fonctionner. Je peux seulement éditer le bookTitle dans bookInfo PAS sur books.

Le déplacement n'est pas une option car il effacera le bookData. J'ai aussi essayé d'écrire en utilisant Push () mais ensuite, je ne peux pas chercher correctement parce que je n'ai pas le pushID (j'ai besoin de la recherche parce que les utilisateurs ne peuvent pas avoir deux livres avec le même nom)

Alors, existe-t-il un moyen de mettre à jour la valeur de clé? ou, y a-t-il une meilleure approche à cela? J'accepte les suggestions. Je vous remercie!

Mise à jour: C’est ce que j’utilise actuellement pour mettre à jour le titre du livre dans bookInfo

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

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

Je pense que je vois ce que vous essayez de faire. Firebase n'a pas le concept de "renommer" une partie du chemin via une mise à jour. Au lieu de cela, vous devrez supprimer complètement le nœud existant et le recréer. Vous pouvez le faire comme ceci:

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

Cela supprimera les informations de books/oldTitle et le re-remplir avec un nouveau titre dans books/newTitle.

Avertissement: Cela repose sur la lecture des données, puis sur une deuxième mise à jour asynchrone. Si vous êtes susceptible d'avoir plusieurs utilisateurs opérant sur les mêmes données en même temps, cela peut entraîner des problèmes. Vous pouvez utiliser un transaction pour le faire atomiquement mais si /books est une ressource de niveau supérieur avec de nombreux nœuds pouvant entraîner des problèmes de performances.

Si une personne est susceptible de modifier les données à la fois, la solution ci-dessus convient. Sinon, vous voudrez peut-être envisager d'utiliser un identifiant non contrôlé par l'utilisateur, tel qu'un identifiant Push.

19
Michael Bleigh

Vous pouvez exporter toute la base de données au format JSON, la renommer dans votre éditeur préféré, l'importer à nouveau dans Firebase via l'option d'importation/exportation en haut à droite de la fenêtre de la console enter image description here

1
Rami

J'ai beaucoup aimé la réponse de Michael Bleigh MAIS ...

Cela me restreignait l'étendue de la profondeur lors du déplacement des touches d'un niveau à un autre, j'ai donc mieux fait cette fonction qui vous permet même de dupliquer (0) ou déplacer (1) = la clé complète en changeant simplement le troisième argument:

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

J'utiliserais toujours Push (), c'est vraiment la bonne façon de stocker plusieurs objets enfants sous catégorie-nœud dans Firebase je pense. Pour la recherche, avez-vous pensé à faire cela côté client? Par exemple, vous pouvez enregistrer tous vos objets livre sous le noeud livres et les récupérer pour les rechercher localement lorsque vous en avez besoin.

Aussi, comme ZenPylon l'a mentionné, Push () vous donne un identifiant unique que vous pouvez également attribuer comme accessoire à chaque objet de livre afin que chaque livre ait une référence à l'endroit où il est stocké dans la base de données.

0
tetutato

Une chose à noter est que vous pouvez récupérer la clé unique de la fonction Push ().

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

Source: Firebase Docs - Push ()

Je ne peux pas dire à partir de votre capture d'écran où se trouve la deuxième instance de bookTitle (est-ce l'élément racine de la capture d'écran?), Mais si vous ne voulez pas utiliser Push(), vous pourrait récupérer les données à cet emplacement, remove(), puis appeler à nouveau set(), cette fois avec le titre du livre mis à jour. Quelque chose comme:

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