2017-10-04 163 views
36

我以爲我讀到您可以使用新的Firebase Firestore查詢子集合,但我沒有看到任何示例。例如,我有下列方式我公司的FireStore設置:Firestore查詢子集合

  • 舞蹈[收藏]
    • danceName
    • 歌曲[收藏]
      • SONGNAME

我將如何查詢「查找所有歌曲名稱=='X'」

回答

35

這是一項尚不存在的功能。它被稱爲「收藏組查詢」,並且可以讓您查詢所有歌曲,而不管哪首歌曲包含它們。這是我們打算支持的東西,但沒有具體的時間表。

此時的替代結構是使歌曲成爲頂級集合,並使得歌曲跳舞是歌曲屬性的一部分。

+0

你會使用從歌曲引用舞firestore參考?你可以通過這些參考查詢嗎? –

+0

您是否使用Firestore參考取決於您。你可以查詢他們。 如果您只想使用參考來查找舞蹈,那麼參考就足夠了。如果你想能夠在一首歌中展示一些關於舞蹈的東西而不用查看舞蹈,那麼我就不會使用參考。儘管如此,這是經典的nosql非規範化問題。 –

+0

所以我的問題是我想通過歌名和歌名來查詢。一首單曲可以有多首歌曲與之相關聯。更進一步,我需要能夠評價舞蹈,以及與舞蹈相關的歌曲。例如:歌曲A和歌曲B去舞蹈A.舞蹈A很有趣,5星級 - 但是歌曲A並不適合(投票),但是歌曲B(投票)。所以我一定會利用Firebase函數跟蹤兩者的平均評分。但我仍然需要能夠查詢WHERE songName ='X'以及WHERE danceName ='Y'。 Firestore將來能夠支持這一點嗎? –

5

@ Nelson.b.austin由於公司的FireStore不會有呢,我建議你有一個平坦的結構,意思是:

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

有它以這種方式,你可以把它做:

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

我希望這有助於。

7

如果您將歌曲存儲爲對象而不是集合,該怎麼辦?每個起舞,用歌聲爲現場:Object類型(不是集合)

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

,那麼你可以用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

該解決方案可以工作,但在歌曲數量很大或可以動態增長的情況下不可擴展。這會增加文檔大小並影響讀/寫性能。有關詳情,請參閱以下鏈接的Firebase文檔(請參閱頁面上的「限制」部分)https://firebase.google.com/docs/firestore/solutions/array –