【问题标题】:Flutter Firebase Cloud Firestore How to filter a stream with where() query using a subcollectionFlutter Firebase Cloud Firestore 如何使用子集合过滤带有 where() 查询的流
【发布时间】:2020-12-18 19:10:17
【问题描述】:

所以我在我的 Cloud Firestore 中有一组食谱,其中包含具有不同食谱的文档(带有随意的 id)。每个文档都有一个包含配方名称和配方持续时间的 2 个字段。 每个文档还有一个名为 LikedBy 的集合,其中的文档具有用户 id 作为 id,并且有一个带有日期的字段。 现在我想返回所有在他们的 likeBy 子集合中包含用户 ID 的食谱。 我将仅使用基本代码编写我尝试过的内容。

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 功能之类的东西来保存帖子。

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但我希望找到另一种解决方案,因为我需要数组包含来过滤另一个字段,而 Cloud firestore 不允许放置多个数组包含。
    • 我也希望找到一种解决方案,按照保存顺序在收藏页面中显示食谱。
    【解决方案2】:

    所以你想要一种查询子集合的方法。为此,只需使用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这个值使用orderby:

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

    【讨论】:

    • 这样我只能返回 likeBy 子集合字段的数据,但我想做的是返回子集合中的所有食谱 likesBy 特定的 userId。
    • 如果这是您想要的,那么@Kris 所说的就是您最好的解决方案。添加一个 likeBy 字段,该字段是一组喜欢该食谱的用户,并使用 array-contains 方法查询他们。如果你想再次使用数组包含,那么你必须进行另一个查询
    • 感谢您的回答,但我想再次按照使用时间戳保存食谱的顺序显示食谱,并将数据设置为 DateTime.now() 并按该字段排序
    • 你可以使用orderBy方法
    • 我必须按哪个字段排序?
    猜你喜欢
    • 2020-10-10
    • 2021-11-13
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多