查询 2 streamBuilder 中的特定文档

Posted

技术标签:

【中文标题】查询 2 streamBuilder 中的特定文档【英文标题】:Query a specific document inside 2 streamBuilder 【发布时间】:2021-12-06 09:02:30 【问题描述】:

我创建了 2 个不同的集合(用户和关注)。

现在我想:

    根据 id 获取存在于关注 collection("list") 中的文档。

    currentUid = doc.id 的第一个集合中获取用户数据(用于第二个集合)。

    ListTile中显示数据。

第一次收藏

await FirebaseFirestore.instance.collection("users").doc(currentUid).set("name":username,"photoUrl":url,"uid":currentUid); 

第二次收集

await FirebaseFirestore.instance.collection("follow").doc(currentUid).collection("list").doc(otherId); 

我用过这个,但它不能正常工作

     body:StreamBuilder<QuerySnapshot>(
              stream: FirebaseFirestore.instance
              .collection("follow")
              .doc(user!.uid)
              .collection("list")
              .snapshots(),
          builder: (context, snapshot1) 
            if (!snapshot1.hasData) 
              return Container();
             else 
              return StreamBuilder<QuerySnapshot>(
                stream: FirebaseFirestore.instance
                    .collection("users")
                    .where("uid",
                        isEqualTo:
                            snapshot1.data!.docs.map((e) => e.id).toList())
                    .snapshots(),
                builder: (context, snapshot2) 
                  if (!snapshot2.hasData) 
                    return Container();
                   else 
                    return ListView(
                      children: snapshot2.data!.docs.map((e) 
                        return ListTile(
                          leading: CircleAvatar(
                            backgroundImage: NetworkImage(e.get('url')),
                            radius: 30,
                          ),
                          title: Text(e.get('username')),
                        );
                      ).toList(),
                    );
                  
                ,
              );

【问题讨论】:

【参考方案1】:

您应该使用in query 而不是equal to 查询。

in 查询返回给定字段匹配任何 比较值。

cloud_firestore 中 in 查询的语法如下:

 .where(field, whereIn: listOfFields)

解决方案:

改变这个:

 .where("uid", isEqualTo: snapshot1.data!.docs.map((e) => e.id).toList())

到这里:

 .where("uid", whereIn: snapshot1.data!.docs.map((e) => e.id).toList())

【讨论】:

以上是关于查询 2 streamBuilder 中的特定文档的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:使用 Streambuilder<QuerySnapshot> 时如何在 firestore 中获取特定文档

无法从 StreamBuilder (Flutter) 查询子集合

如何在streambuilder中查询firestore文档并更新listview

使用 StreamBuilder 和从 Firebase Firestore 数据库查询时,ListView 不会更新/获取数据

StreamBuilder 的 Firebase 查询出现并立即消失

使用 StreamBuilder 获取 Firestore 文档,其中包含颤动中的地图列表