2017-10-04 16 views
36

Wydawało mi się, że przeczytałem, że możesz zapytać o podkolekcje w nowym Firebore Firestore, ale nie widzę żadnych przykładów. Na przykład mam setup FireStore w następujący sposób:Subcollections zapytania w magazynie ogniowym

  • Dances [kolekcja]
    • danceName
    • Songs [zbiór]
      • songName

Jak mogę zapytać "Znajdź wszystkie tańce, w których nazwa utworu ==" X ""

Odpowiedz

35

To jest funkcja, która jeszcze nie istnieje. Nazywa się to "zapytaniem grupy kolekcji" i pozwala na odpytywanie wszystkich utworów bez względu na to, który taniec zawierał. To jest coś, co zamierzamy wspierać, ale nie mamy konkretnego harmonogramu, kiedy nadejdzie.

Alternatywną strukturą w tym miejscu jest tworzenie utworów na najwyższym poziomie i sprawienie, że taniec jest częścią własności utworu.

+0

Lepiej odwołać się do tańca z piosenki za pomocą odniesienie do firewalla? Czy możesz zapytać o te odniesienia? –

+0

To, czy używasz referencji Firestore, zależy od Ciebie. Możesz zapytać przez nich. Jeśli chcesz korzystać z odnośników do wyszukiwania tańca, wystarczy odwołanie. Jeśli chcesz mieć możliwość pokazania czegoś o tańcu z wnętrza utworu bez oglądania tańca, to nie użyłbym odnośnika. Jest to jednak klasyczny problem denormalizacji nosql. –

+0

Więc moim problemem jest zapytanie o nazwę tańca ORAZ według nazwy utworu. Pojedynczy taniec może mieć wiele piosenek z nim związanych. Co więcej, muszę być w stanie ocenić taniec, ORAZ piosenkę związaną z tańcem. Np .: Piosenka A i Piosenka B idą do tańca A. Taniec A jest zabawny, 5-gwiazdkowy - ALE Piosenka A nie pasuje (w głosowaniu), ale Piosenka B robi (w głosowaniu). Z pewnością wykorzystam funkcje Firebase, aby śledzić średnią ocenę obu. Ale wciąż muszę mieć możliwość zapytania WHERE songName = 'X', a także WHERE danceName = 'Y'. Czy Firestore będzie w stanie wesprzeć to w przyszłości? –

5

@ Nelson.b.austin Od FireStore nie ma tego jeszcze, proponuję, aby mieć płaską strukturę, co oznacza:

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

Mając ją w ten sposób, można zrobić to:

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

Mam nadzieję, że to pomoże.

7

Co zrobić, jeśli przechowujesz utwory jako obiekt, a nie jako kolekcję? Każdy tańczy jak z piosenek jako pole: Rodzaj obiektu (nie zbiór)

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

następnie można kwerendy dla wszystkich tańców z aNameOfASong:

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

To rozwiązanie działa, ale nie jest skalowalne, jeśli liczba utworów jest duża lub dynamicznie rośnie. Zwiększyłoby to rozmiar dokumentu i wpłynęłoby na wydajność odczytu/zapisu. Więcej informacji na ten temat można znaleźć w poniższej dokumentacji Firebase (zobacz ostatnią sekcję "Ograniczenia" na stronie) https://firebase.google.com/docs/firestore/solutions/arrays –

Powiązane problemy