首页 > 解决方案 > 对象中的 Flutter Firestore 查询字段

问题描述

我正在编写一个 Flutter 应用程序并尝试将文档添加到列表中,其中 Firestore 中的contractorUserId 值字段(在 jobBids 下)等于登录用户。下图显示了我的 Firestore 结构(jobBids 中的contractorUserId) Firestore 数据库的结构

我正在使用以下代码:

_jobsCollectionReference.snapshots().listen((jobBidsSnapshot) {
      if (jobBidsSnapshot.docs.isNotEmpty) {
        var jobsWithBids = jobBidsSnapshot.docs
            .map((jobBidsSnapshot) =>
                JobWithBids.fromMap(jobBidsSnapshot.data(), jobBidsSnapshot.id))
            .where((mappedItem) => mappedItem.jobBids != null)
            .where((mappedItem) =>
                mappedItem.jobBids
                    .map((e) => e.contractorUserId == loggedInUser.uid)
                    .toList()
                    .length >
                0)
            .toList();

此代码生成一个包含contractorUserId 字段存在的所有对象的列表。但是,其目的是仅添加contractorUserId 等于登录用户的文档。

有谁知道我做错了什么?

标签: firebasefluttergoogle-cloud-firestore

解决方案


您收到错误是因为下面的代码评估为,true因为您只是检查列表的长度,即使e.contractorUserId == loggedInUser.uid等于 false :

 mappedItem.jobBids
   .map((e) => e.contractorUserId == loggedInUser.uid)
   .toList()
   .length >
   0

所以你的代码实际上是:

var jobsWithBids = jobBidsSnapshot.docs
  .map((jobBidsSnapshot) =>JobWithBids.fromMap(jobBidsSnapshot.data(), jobBidsSnapshot.id))
  .where((mappedItem) => mappedItem.jobBids != null)
  .where((mappedItem) => true) //This is what it evaluates to
  .toList();

您应该在最后一次检查中切换mapwhere,因此它会过滤任何不满足条件的列表。见下文:

var jobsWithBids = jobBidsSnapshot.docs
  .map((jobBidsSnapshot) =>JobWithBids.fromMap(jobBidsSnapshot.data(), jobBidsSnapshot.id))
  .where((mappedItem) => mappedItem.jobBids != null)
  .where((mappedItem) => mappedItem.jobBids
      .where((e) => e.contractorUserId == loggedInUser.uid)
      .toList()
      .length > 0
  ) 
  .toList();

推荐阅读