Flutter Firebase Cloud Firestore如何使用子集合通过where()查询过滤流

时间:2020-08-30 13:02:02

标签: firebase flutter dart google-cloud-firestore

所以我在Cloud Firestore中有一个食谱集合,其中包含具有不同食谱的文档(带有临时ID)。每个文档都有一个包含配方名称和配方持续时间的2个字段。 每个文档还具有一个名为likelyBy的集合,其中有一些文档的ID为ids用户ID,并且具有一个带有日期的字段。 现在,我想返回所有在其likeBy子集合中具有userId的配方。 我将只用基本代码写出我尝试过的内容。

String userId= 'uiuu4fn3fff4fu';  

Scaffold(
body:StreamBuilder(
stream: THE STREAM THAT I NEED,
builder:(context,snapshot){
return ListView.builder(
itemCount: snapshot.data.documents.length
itemBuilder:(context,index){
return Column(children:[
Text(snapshot.data.documents[index]['recipeName']),
Text(snapshot.data.documents[index][recipeDuration]),]) } ) } ) )

我想要的是仅返回在likeBy子集合中具有特定用户uid的文档。

我已经尝试过使用此流

Firestore.instance.collection('recipes').parent().collection('likedBy').where(FieldPath.documentId, 
isEqualTo,userId).snapshots()

但是它不起作用,我也不知道我还能尝试什么。 我们非常感谢您的帮助。

不应由用户而是由管理员添加项目,这意味着将有一个由管理员添加的项目列表和一个可以将其添加到收藏夹的用户列表,而我想要实现的是用户可以看到所有收藏夹按保存顺序排列。明确地说,我想要类似Instagram的功能来保存帖子。

2 个答案:

答案 0 :(得分:1)

因此,您需要一种查询子集合的方法。为此,只需使用collectionGroup method

db.collectionGroup('likedBy').where('userId', '==', '1');

要使用值排序,请使用时间戳:

// add to your document
db.collection("items")
 .add({...item, created: firebase.firestore.Timestamp.fromDate(new Date()) })

并使用orderby对该值进行排序:

db.collection("items")
     .orderBy("created", "asc")

答案 1 :(得分:0)

您可能想要做的是在配方文档上拥有一个“ likedBy”属性,而不是其自己的子集合。如果只是用户ID列表,那应该没问题。然后,您可以只说出recipeCollection.where(likedBy,array contains:userId)