2017-10-04 32 views
36

Yeni Firebase Firestore ile alt koleksiyonları sorgulayabileceğinizi okudum, ancak hiçbir örnek göremiyorum.Firestore sorgu alt koleksiyonları

  • Dans [toplama]
    • danceName
    • Şarkılar [toplama]
      • songName
: Örneğin aşağıdaki şekilde benim Firestore kurulum

"SongName == 'X'" olan tüm dansları bulun. "

cevap

35

Bu, henüz mevcut olmayan bir özelliktir. Buna "koleksiyon grubu sorgusu" denir ve hangi şarkıyı içerdiğine bakılmaksızın tüm şarkıları sorgulamanıza izin verir. Bu, desteklemeyi düşündüğümüz bir şeydir, ancak geldiğinde üzerinde somut bir zaman çizelgesi yoktur.

Bu noktada alternatif yapı, şarkıları üst düzey bir koleksiyon haline getirmek ve şarkıyı dans etmek, şarkının bir özelliğinin parçası olmaktır. , Bunu yapabilirler

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

bu şekilde onu alarak: FireStore henüz o olmadığından Nelson.b.austin @

+0

bir kullanarak şarkıdan dans başvuru misiniz firestore referansı? Bu referanslar tarafından sorgulanabilir misiniz? –

+0

Bir Firestore referansı kullanıp kullanmamanız size kalmış. Onlar tarafından sorgulayabilirsiniz. Sadece referansa bakmak için referansları kullanmak istiyorsanız referans yeterlidir. Dansla ilgili bir şarkıdan dansla ilgili bir şey gösterebilmek istiyorsanız, o zaman bir referans kullanmazdım. Bu klasik nosql denormalizasyon sorunu olsa da. –

+0

Yani benim sorunum, dans adı ve şarkı adına göre sorgulamak istiyorum. Tek bir dans, onunla ilişkili birden fazla şarkıya sahip olabilir. Daha da fazlası, dansa ve dansla ilgili şarkıya puan verebilmem gerekiyor. Örn: Şarkı A ve Şarkı B, Dans A'ya gidiyor. Dans A, eğlenceli, 5 yıldız - AMA Şarkı A, gerçekten oy vermiyor (oylama), ancak Şarkı B (oylama) yapar. Bu yüzden, her ikisinin de ortalama puanını takip etmek için kesinlikle Firebase Functions kullanacağım. Ama yine de WHERE songName = 'X' ve WHERE danceName = 'Y' sorgulayabilmem gerekiyor. Firestore bunu gelecekte destekleyebilir mi? –

5

, ben anlam, bir düz yapıya sahip önermek

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

Umarım bu yardımcı olur.

7

Şarkıları koleksiyon olarak değil de nesne olarak depolarsanız ne olur? Her bir alan olarak şarkılarla gibi dans: tip nesne (bir koleksiyon)

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

sonra aNameOfASong tüm dansları sorgulamak olabilir:

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

Bu çözüm işe yarayacak, ancak şarkıların sayısının büyük olması ya da dinamik olarak büyüyebilmesi durumunda ölçeklenebilir değil. Bu, belge boyutunu artıracak ve okuma/yazma performansını etkileyecektir. Bu konuyla ilgili daha fazla bilgi, aşağıda bağlantılı Firebase belgelerinde bulunabilir (bkz. Son bölüm, sayfadaki 'Sınırlamalar') https://firebase.google.com/docs/firestore/solutions/arrays –