flutter 根据父文档中的字段查询Firestore子集合中的文档

iezvtpos  于 2023-03-09  发布在  Flutter
关注(0)|答案(1)|浏览(161)

我的应用有一个集合(用户)和子集合“user”集合具有包括字段“Status”的常规用户信息。但是状态是动态的。它可以是“未验证”、“待验证”、或“verified”。“Document”子集合包含来自用户的所有信息,以及用户发送其文档以进行验证的附加字段“document”。当前管理员直接访问“文档”字段列表。但是,我希望他在且仅在“用户”集合中的"状态“字段为”待验证“时访问它。我不知道如何做到这一点。有帮助吗?
这就是管理面板如何访问屏幕上的主集合“用户”用户。

QueryDocumentSnapshot<Map<String, dynamic>>? selectedUser;
StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
                
                stream:
                    FirebaseFirestore.instance.collection('users').snapshots(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    return ListView.builder(
                      itemCount: snapshot.data!.docs.length,
                      itemBuilder: (context, index) {
                        return Card(
                          child: ListTile(
                            onTap: () {
                              setState(() {
                                selectedUser = snapshot.data!.docs[index];
                              });
                            },
                            title: Text(
                              snapshot.data!.docs[index].get('Status'),
                            ),
                          ),
                        );
                      },
                    );
                  }
                  if (snapshot.hasError) {
                    return const Text('Error');
                  } else {
                    return const Center(child: Text('Do requests yet'));
                  }
                },
              ),

这就是管理面板如何访问不同屏幕上的子集合“文档”:但我只想在“user”集合中的“status”字段为“pending verification”时访问它。

QueryDocumentSnapshot<Map<String, dynamic>>? pendingVerifications;
StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
          stream: FirebaseFirestore.instance
              .collectionGroup('Documants')
              .snapshots(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data!.docs.length,
                itemBuilder: (context, index) {
                  return Card(
                    child: ListTile(ElevatedButton( onPressed: () {}, child: const 
                 Text('Approve')),
                   )
rjzwgtxy

rjzwgtxy1#

Firestore查询只能根据它返回的文档中的数据进行排序和过滤。
虽然可以使用集合组查询来查询所有名为Documents的集合,但Firestore无法根据用户文档中的值过滤这些文档。
您的选项包括:

  • 将父用户文档中的数据复制到Documents子集合中的每个文档中。这是最常用的解决方案,但如果状态值不稳定,则可能不理想。
  • 首先执行查询以获取适用用户的列表,然后依次查询每个用户的Documents子集合。

这两种方法都有优点,所以你必须自己决定什么方法最适合你的应用程序。

相关问题