2016-08-15 2 views
1

Ich versuche, eine 1 zu viele Datenstruktur in Firebase zu erstellen. Meine beiden Objekte sehen aus wie diese1 zu viele Firebase Abfrage

category: 
{ 
    cat1: { 
     name: 'Category 1' 
    }, 
    cat2: { 
     name: 'Category 2' 
    } 
} 

products: 
{ 
    product1: { 
    name: 'Product 1', 
    categories: { 
     cat1: true 
    } 
    }, 
    product2: { 
    name: 'Product 2', 
    categories: { 
     cat1: true, 
     cat2: true 
    } 
    } 
} 

Nun, wie genau würde ich diese Daten abfragen, mit allen Kategorien zu bekommen sagen product2? Ich habe dies versucht, die mir die erforderlichen Daten zurückkommt, aber es scheint ineffizient und nicht übereinstimmt, wie die Dokumente vorzuschlagen scheinen Sie es tun ....

var ref = new Firebase("https://<my-firebase-url>/products/product2"); 
    var catRef = new Firebase("https://<my-firebase-url>/category"); 
    ref.once('value', function(snap) { 
     var result = snap.val(); 
     Object.keys(result.categories).map(key => { 
     catRef.child(key).once('value', function(category){ 
... //add category to array etc 
     } 
     } 
    } 

Die docs die child_added Ereignis verwenden vorschlagen aber wie macht das Sinn wenn ich die ganze Liste nicht nur bei einem Kind hinzufügen möchte? (https://www.firebase.com/docs/web/guide/structuring-data.html):

// List the names of all Mary's groups 
var ref = new Firebase("https://docs-examples.firebaseio.com/web/org"); 
// fetch a list of Mary's groups 
ref.child("users/mchen/groups").on('child_added', function(snapshot) { 
    // for each group, fetch the name and print it 
    String groupKey = snapshot.key(); 
    ref.child("groups/" + groupKey + "/name").once('value', function(snapshot) { 
    System.out.println("Mary is a member of this group: " + snapshot.val()); 
    }); 
}); 
+0

Die docs auf firebase.com sind jetzt veraltet. Verwenden Sie die neue Website: firebase.google.com. In Bezug auf "child_added" werden nicht nur das neu hinzugefügte Kind, sondern auch die vorhandenen untergeordneten Elemente abgerufen. Sehen Sie sich die Firebase [Upgrade-Anleitung] (https://firebase.google.com/support/guides/firebase-web) an. –

+1

Auf die Effizienz der "looped loading". Dies ist ein häufiges Problem von Entwicklern, die Firebase neu kennen. Aber Firebase lädt die Elemente über eine einzelne Verbindung und Pipelines Anforderungen, so dass es in der Regel ziemlich schnell für vernünftige Datenmengen ist. Siehe http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 für eine längere Erklärung . –

Antwort

3

Um alle Kategorien zu erhalten, die zu product2 gehören, sollten Sie verwenden:

firebase.database().ref('products/product2/categories').on('child_added', snapshot => { 
    firebase.database().ref('category/'+snapshot.key).on('value', snap => { 
     console.log(snap.val().name + ' belongs to product2'); //Will print Category 1 and Category 2 
    }); 
}):