当前位置: 首页 > 知识库问答 >
问题:

如何过滤firebase云firestore上的id列表?

井高峯
2023-03-14

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

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

现在,我想按用户显示所有申请工作。首先:获取日志用户ID,我存储本地日志用户ID。所以,我可以获取日志用户ID。

第二:我根据该id筛选应用作业。如下所示,var ref=\u db。集合(“applyJobs”)。其中('userId',isEqualTo:uid) 。我在这里没有调用用户集合来获取uid。因为我已经在本地存储uid。这是最佳实践吗?

第三:我在这里存储结果列表

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

共有3个答案

袁赞
2023-03-14

请看一下这个例子。它将集合引用绑定到列表。

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

缑修齐
2023-03-14

不确定是否有正式文件记录,但现在这是可能的!

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

在此处找到:https://stackoverflow.com/a/52252264/10562805

方博
2023-03-14

我想通过id列表获取所有作业。如何筛选它?

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

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

 类似资料:
  • 正如我从“云火数据模型”指南中得到的,“每个文档都由一个名称标识。”是否可以通过该文档标识符(即名称或ID)查询集合? 例如,集合“Things”中的文档具有IDs、1、2等。: 是否可以查询 ID 小于 100 的文档?

  • 一旦我将类别从数组更改为映射,我想我可以使用多个where条件来过滤文档 现在问题2,firebase要求为复合查询添加索引。我在每个文档中保存的类别是动态的,我无法提前添加这些索引。在这种情况下,理想的解决方案是什么?如有任何帮助,不胜感激。

  • 问题内容: 在执行groupby(’name’)并在其他列上使用过mean()函数后,我得到了这样的系列 谁能告诉我如何过滤出平均值为1.000000的行?谢谢,我非常感谢您的帮助。 问题答案: In [5]:

  • 问题内容: 这是我的表(简体,仅重要的列): 以及一些样本数据: 我想选择键下任意位置的行。像这样的东西: 数据完全像样本中一样嵌套(仅一层)。 当前,我们正在使用PostgreSQL 9.3.5。 在PostgreSQL 9.3中可以吗?也许是9.4? 问题答案: 您的查询已关闭。 是关键功能。还是为了。进行了一些改进: 旧的sqlfiddle db <> fiddle在这里 已经返回该值作为数

  • 问题内容: 基本上,我有一个名为的结构,主题包含,以及一个标志(有关说明,请参见下面的屏幕截图)。 在应用程序中,我想过滤数据,仅显示具有的主题。 这就是我想要做的: 但这是行不通的。我应该如何处理?在此先感谢您的帮助。 问题答案: 您那里有一些小错误。总体来说还算不错,但是结合起来它们将永远无法正常工作: 调用任何方法都将返回一个新对象 您需要先过滤其价值 您需要遍历结果 结合这些: 我们会定期