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)加载每个员工并分别查询他们的班次子集合,以查看是否有任何结果。这是很棒的东西。如果我在员工文档中保留最多两周的可用性数据(将日期映射为键,将布尔值映射为值),那么哪个选项更具成本效益?这听起来像是一个单独的问题。但成本相当简单:用餐巾纸计算读取了多少文档、写入了多少文档以及读取了多少数据,然后将它们放入数据库。