firebase - 如何过滤firebase cloud firestore上的id列表?
问题描述
我有两个系列。(applyJobs
和Jobs
和users
)。当用户申请工作时,我将该记录存储在applyJobs
集合中。像这样:
applyId:****,
jobId:*****,
userId:*****
现在,我想显示用户申请的所有工作。第一:获取登录的用户ID,我存储本地登录的用户ID。因此,我可以获得记录的用户 ID。
第二:我按该 ID 过滤 Apply Jobs。像这样,var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);
。我在这里我没有调用users
collection来获取uid。因为我已经在本地存储了 uid。这是最佳实践吗?
第三:我在这里存储结果List<ApplyJobsModelClass>
。我想通过 id 列表获取所有工作。我该如何过滤它?
这是我尝试过的方式。但这不是 ID 列表。只有一个身份证。
streamApplyJob(List<String> jobId) {
Collection('jobs').document(jobId);
}
我也尝试过这种方式。
Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
return ref.snapshots().map((list) =>
list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
}
试图获得长度,但结果是0
db.streamApplyJob(jobIds).listen((v)=>{
print(v.length)
});
完整代码
数据库端
///Get a stream of apply jobs
Stream<List<ApplyJobModel>> streamApplyJobs(String uid) {
var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);
return ref.snapshots().map((list) =>
list.documents.map((doc) => ApplyJobModel.fromFirestore(doc)).toList());
}
///Get a stream of a single document
Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
return ref.snapshots().map((list) =>
list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
}
打电话
List<String> jobIds = [];
void getData() {
db.streamApplyJobs(widget.uid).listen((listApplies) => {
for (int i = 0; i < listApplies.length; i++)
{jobIds.add(listApplies[i].jobId)},
});
db.streamApplyJob(jobIds).listen((v)=>{
print(v.length)
});
}
解决方案(它现在正在工作) - 这是最佳实践还是有其他最佳方法来做到这一点?
Future<List<JobModel>> getJobs() async {
await db.streamJobs(true).listen((jobs) {
setState(() {
jobModel = jobs;
});
});
return jobModel;
}
Future getData() async {
await getJobs();
db.streamApplyJobs(widget.uid).listen((apply) => {
for (int j = 0; j < jobModel.length; j++)
{
for (int i = 0; i < apply.length; i++)
{
if (apply[i].jobId == jobModel[j].jobId)
{
jobModelNew.add(jobModel[j]),
}
}
}
});
}
解决方案
我想通过 id 列表获取所有工作。我该如何过滤它?
目前无法将 ID 列表传递给 Firestore 查询并获取与所有这些 ID 匹配的文档。请参阅Google Firestore - 如何在一次往返中通过多个 id 获取文档?(讨论使用文档 ID 执行此操作)和Firebase Firestore - OR 查询(讨论在单个字段上过滤多个值)。
除非您的用例恰好与第二个答案中提到的解决方法相匹配,否则您必须对每个值执行单独的查询,并将结果合并到您的应用程序代码中。
推荐阅读
- php - 相同的 PHP,相同的服务器,不同的结果
- javascript - 香草Javascript中的双(多级)倒计时
- python - Kivy 1.10.1 使用函数更新 ScreenManager 标签
- java - 如何从 Java IntStream 中的嵌套 .forEach 收集结果
- lua - Roblox Studio 跳过循环
- google-apps-script - 发送邮件后根据志愿者申请状态设置单元格值
- javascript - 如何实现 iframe 元素选择器?(如铬)
- amazon-cognito - AWS Cognito 的“忘记用户名”流程?
- android - Android MP3 播放器,播放/暂停按钮不起作用
- php - PHP发送带有多个文件上传到服务器的电子邮件表单