首页 > 解决方案 > 如何过滤firebase cloud firestore上的id列表?

问题描述

我有两个系列。(applyJobsJobsusers)。当用户申请工作时,我将该记录存储在applyJobs集合中。像这样:

applyId:****, 
jobId:*****,
userId:*****

现在,我想显示用户申请的所有工作。第一:获取登录的用户ID,我存储本地登录的用户ID。因此,我可以获得记录的用户 ID。

第二:我按该 ID 过滤 Apply Jobs。像这样,var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);。我在这里我没有调用userscollection来获取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]),
                    }
                }
            }
        });
  }

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


我想通过 id 列表获取所有工作。我该如何过滤它?

目前无法将 ID 列表传递给 Firestore 查询并获取与所有这些 ID 匹配的文档。请参阅Google Firestore - 如何在一次往返中通过多个 id 获取文档?(讨论使用文档 ID 执行此操作)和Firebase Firestore - OR 查询(讨论在单个字段上过滤多个值)。

除非您的用例恰好与第二个答案中提到的解决方法相匹配,否则您必须对每个值执行单独的查询,并将结果合并到您的应用程序代码中。


推荐阅读