【问题标题】:How to filter list of id on firebase cloud firestore?如何过滤firebase cloud firestore上的id列表?
【发布时间】:2020-02-12 19:09:04
【问题描述】:

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

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

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

第二:我按该 ID 过滤 Apply Jobs。像这样,var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);。我在这里我没有调用users 集合来获取uid。因为我已经在本地存储了 uid。这是最佳做法吗?

第三:我将结果存储在这里List<ApplyJobsModelClass>。我想通过 id 列表获取所有工作。如何过滤?

这是我尝试过的方式。但这不是 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]),
                    }
                }
            }
        });
  }

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

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

    目前无法将 ID 列表传递给 Firestore 查询并获取与所有这些 ID 匹配的文档。请参阅Google Firestore - how to get document by multiple ids in one round trip?(讨论使用文档 ID 执行此操作)和 Firebase Firestore - OR query(讨论在单个字段上过滤多个值)。

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

    【讨论】:

    • 我是这样做的:请告诉我,最佳实践是否可行。首先:我得到所有jobs 集合数据并存储局部变量。我得到所有applyJob 收集数据和过滤器
    • 我添加了我的解决方案,请检查并让我知道
    【解决方案2】:

    不确定它是否正式记录在任何地方,但现在可能!

    .where(admin.firestore.FieldPath.documentId(), "in", [array, of, ids])
    

    在这里找到:https://stackoverflow.com/a/52252264/10562805

    【讨论】:

      【解决方案3】:

      请查看this example。它将 CollectionReference 绑定到列表。

      如果这有帮助,请告诉我。

      【讨论】:

      • 我添加了我的解决方案..它现在正在工作..请检查并让我知道
      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2021-07-06
      • 2020-12-18
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多