Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 在文档和子集合中搜索Firestore查询_Firebase_Flutter_Google Cloud Firestore - Fatal编程技术网

Firebase 在文档和子集合中搜索Firestore查询

Firebase 在文档和子集合中搜索Firestore查询,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我有一个员工文档(姓名、职务等)和一个子集合,其中包含分配给该员工的所有班次(子集合的文档) 分配新班次时,我只想检索具有特定指定的员工,这意味着他们能够熟练地执行此班次 此外,我应该在子集合中搜索,并仅获取没有与要分配的班次相同日期的文档的员工 @override Stream<List<Employee>> availableEmployeesForGivenDesignation(String designation, DateTime statusDate)

我有一个员工文档(姓名、职务等)和一个子集合,其中包含分配给该员工的所有班次(子集合的文档)

分配新班次时,我只想检索具有特定指定的员工,这意味着他们能够熟练地执行此班次

此外,我应该在子集合中搜索,并仅获取没有与要分配的班次相同日期的文档的员工

 @override
  Stream<List<Employee>> availableEmployeesForGivenDesignation(String designation, DateTime statusDate) {
    return _employeeCollection
        .where('designation', isEqualTo: designation)
        .snapshots()
        .map((snapshot) {
         //todo search in the sub-collection
          ...
        });
  }
目前,我只知道如何检索具有特定名称的员工

我无法实现的是,我只能让轮班当天空闲的熟练员工分配工作

 @override
  Stream<List<Employee>> availableEmployeesForGivenDesignation(String designation, DateTime statusDate) {
    return _employeeCollection
        .where('designation', isEqualTo: designation)
        .snapshots()
        .map((snapshot) {
         //todo search in the sub-collection
          ...
        });
  }
@覆盖
Stream AvailableEmployeesForginDesignation(字符串名称、日期时间状态日期){
返回(u employeeCollection)
其中(“名称”,isEqualTo:名称)
.快照()
.map((快照){
//子集合中的todo搜索
...
});
}

Firestore查询仅适用于单一类型的集合。在一个查询中无法同时搜索员工及其班次,您至少需要两个查询

为了让用例只包含一个查询,您必须复制数据。你有两个选择:

  • 将必要的班次数据复制到员工文档中,然后仅查询员工集合
  • 将必要的员工数据复制到他们的轮班文档中,然后在所有轮班集合中执行一次检查
  • 考虑到你所描述的,第二种选择听起来很有希望。看起来是这样的:

    db.collectionGroup("shifts")
      .where('designation', isEqualTo: designation)
      .where(...your other condition...)
      .snapshots()
      .map((snapshot) {
        print(snapshot.reference.parent().parent().documentID);
      })
    

    然后,您将使用该文档ID来查找员工文档。

    Firestore查询仅适用于单一类型的集合。在一个查询中无法同时搜索员工及其班次,您至少需要两个查询

    为了让用例只包含一个查询,您必须复制数据。你有两个选择:

  • 将必要的班次数据复制到员工文档中,然后仅查询员工集合
  • 将必要的员工数据复制到他们的轮班文档中,然后在所有轮班集合中执行一次检查
  • 考虑到你所描述的,第二种选择听起来很有希望。看起来是这样的:

    db.collectionGroup("shifts")
      .where('designation', isEqualTo: designation)
      .where(...your other condition...)
      .snapshots()
      .map((snapshot) {
        print(snapshot.reference.parent().parent().documentID);
      })
    

    然后,您将使用该文档ID来查找员工文档。

    您的意思是,将一些员工数据作为字段传递给一个体面的子集合中的轮班文档。我仍然不知道如何只让员工在给定日期内不轮班。记住,我只想获得可用员工的选择。你不能搜索没有值的文档。因此,您可能需要考虑插入所有的轮班,然后在那里保留一个“已预订”的字段。我能想到的唯一选择是:1)在员工文档中保留一个可用的轮班表(我的答案中的选项1),2)加载每个员工并分别查询他们的班次子集合,以查看是否有任何结果。这是很棒的东西。如果我在员工文档中保留最多两周的可用性数据(将日期映射为键,将布尔值映射为值),那么哪个选项更具成本效益?这听起来像是一个单独的问题。但成本是相当简单的:用餐巾纸计算读取了多少文档、写入了多少文档以及读取了多少数据,然后将它们放入。因此,您的意思是,将一些员工数据作为字段传递给在一个值得尊敬的子集合中找到的shift文档。我仍然不知道如何只让员工在给定日期内不轮班。记住,我只想获得可用员工的选择。你不能搜索没有值的文档。因此,您可能需要考虑插入所有的轮班,然后在那里保留一个“已预订”的字段。我能想到的唯一选择是:1)在员工文档中保留一个可用的轮班表(我的答案中的选项1),2)加载每个员工并分别查询他们的班次子集合,以查看是否有任何结果。这是很棒的东西。如果我在员工文档中保留最多两周的可用性数据(将日期映射为键,将布尔值映射为值),那么哪个选项更具成本效益?这听起来像是一个单独的问题。但成本相当简单:用餐巾纸计算读取了多少文档、写入了多少文档以及读取了多少数据,然后将它们放入数据库。