2017-10-04 6 views
36

Ich dachte, ich lese, dass Sie Subkollektionen mit dem neuen Firebase Firestore abfragen können, aber ich sehe keine Beispiele. Zum Beispiel habe ich meine Firestore-Setup auf folgende Weise:Firestore Query subcollections

  • Dances [Sammlung]
    • danceName
    • Songs [collection]
      • songname

Wie könnte ich abfragen "Finde alle Tänze, wo songName == 'X'"

Antwort

35

Dies ist eine Funktion, die noch nicht existiert. Es wird eine "Sammlungsgruppenabfrage" genannt und ermöglicht es Ihnen, alle Lieder abzufragen, unabhängig davon, welcher Tanz sie enthält. Das wollen wir unterstützen, haben aber keine konkrete Zeitplanung.

Die alternative Struktur an diesem Punkt ist es, Songs zu einer Top-Level-Sammlung zu machen und zu machen, welcher Song der Song ist, der Teil einer Eigenschaft des Songs ist.

+0

Würden Sie den Tanz aus dem Lied Referenz unter Verwendung eines Firestore-Referenz? Können Sie diese Referenzen abfragen? –

+0

Ob Sie eine Firestore-Referenz verwenden oder nicht, bleibt Ihnen überlassen. Sie können nach ihnen abfragen. Wenn Sie nur die Referenzen verwenden möchten, um den Tanz nachzuschlagen, dann ist eine Referenz ausreichend. Wenn Sie in der Lage sein möchten, etwas über den Tanz in einem Lied zu zeigen, ohne den Tanz anzuschauen, dann würde ich keine Referenz verwenden. Dies ist jedoch das klassische Nosql-Denormalisierungsproblem. –

+0

Also mein Problem ist, ich möchte nach Tanznamen und Songname abfragen. Ein einzelner Tanz kann mit mehreren Liedern verbunden sein. Noch dazu muss ich in der Lage sein, den Tanz und das mit dem Tanz verbundene Lied zu bewerten. Bsp .: Lied A und Lied B gehen zu Tanz A. Tanz A macht Spaß, 5 Sterne - ABER Lied A passt nicht wirklich (Stimme unten), aber Lied B tut (Stimme oben). Also werde ich auf jeden Fall Firebase-Funktionen verwenden, um eine durchschnittliche Bewertung beider zu verfolgen. Aber ich muss immer noch WHERE songName = 'X' und WHERE danceName = 'Y' abfragen können. Wird Firestore dies in Zukunft unterstützen können? –

5

@ Nelson.b.austin Da Firestore hat das noch nicht, empfehle ich Ihnen eine flache Struktur zu haben, was bedeutet:

Dances = { 
    danceName: 'Dance name 1', 
    songName_Title1: true, 
    songName_Title2: true, 
    songName_Title3: false 
} 

es auf diese Weise, so können Sie es getan:

var songTitle = 'Title1'; 
var dances = db.collection("Dances"); 
var query = dances.where("songName_"+songTitle, "==", true); 

Ich hoffe, das hilft.

7

Was passiert, wenn Sie Songs als Objekt statt als Sammlung speichern? Jeder Tanz wie mit Liedern als Feld: Typ Object (keine Sammlung)

{ 
    danceName: "My Dance", 
    songs: { 
    "aNameOfASong": true, 
    "aNameOfAnotherSong": true, 
    } 
} 

dann könnte man für alle Tänze mit aNameOfASong Abfrage:

db.collection('Dances') 
    .where('songs.aNameOfASong', '==', true) 
    .get() 
    .then(function(querySnapshot) { 
    querySnapshot.forEach(function(doc) { 
     console.log(doc.id, " => ", doc.data()); 
    }); 
    }) 
    .catch(function(error) { 
    console.log("Error getting documents: ", error); 
    }); 
+0

Diese Lösung funktioniert, ist aber nicht skalierbar, wenn die Anzahl der Songs groß ist oder dynamisch wachsen kann. Dies würde die Dokumentgröße erhöhen und die Lese-/Schreibleistung beeinträchtigen. Weitere Informationen hierzu finden Sie in der Firebase-Dokumentation, die unten verlinkt ist (siehe den letzten Abschnitt "Einschränkungen" auf der Seite) https://firebase.google.com/docs/firestore/solutions/arrays –