firebase - 对象中的 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 等于登录用户的文档。
有谁知道我做错了什么?
解决方案
您收到错误是因为下面的代码评估为,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();
您应该在最后一次检查中切换map
到where
,因此它会过滤任何不满足条件的列表。见下文:
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();
推荐阅读
- ios - TabBar 未显示 TabBar 项目标题 Swift 5
- r - 从 RStudio 将多个文件上传到 Google Cloud
- php - filesize 必须大于 0 php write files aldough 代码已准备好防止错误
- javascript - 每次运行函数时如何将对象添加到数组中?
- xaml - 如何根据 Xamarin.Forms xaml 中的本地化语言显示选取器项目
- python - 熊猫打印 CSV 文件的问题
- ios - 获取iOS系统默认主题颜色的任何方式
- javascript - 在 QML 中使用 ParseServer 后端 JS 库
- azure-data-explorer - 当我们停止(暂停) Kusto 和 ADX 集群时,我们是否为存储付费?
- python - argpartition 表现出意外行为