2017-10-04 161 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 –